알고리즘 풀이/백준
2583번-영역 구하기
claire
2022. 2. 7. 12:07
#include<bits/stdc++.h>
#define X first
#define Y second
using namespace std;
int board[102][102];
int vis[102][102];
int dx[4] = { 1,-1,0,0 };
int dy[4] = { 0,0,1,-1 };
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int m, n, k; //m은 세로, n은 가로, k는 사각형 개수
queue<pair<int, int>> Q;
vector<int> v;
cin >> m >> n >> k;
while (k--) {
int x1, x2, y1, y2;
cin >> x1 >> y1 >> x2 >> y2;
for (int i = x1; i < x2; i++) {
for (int j = y1; j < y2; j++) {
board[j][i] = 1;
}
}
}
int cnt = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (board[i][j] == 1 || vis[i][j] > 0) continue;
Q.push({ i,j });
vis[i][j] = 1;
int width = 1;
cnt++;
while (!Q.empty()) {
auto cur = Q.front(); Q.pop();
for (int dir = 0; dir < 4; dir++) {
int nx = cur.X + dx[dir];
int ny = cur.Y + dy[dir];
if (nx < 0 || nx >= m || ny < 0 || ny >= n)continue;
if (board[nx][ny]==1||vis[nx][ny]>0)continue;
Q.push({ nx,ny });
vis[nx][ny] = 1;
width++;
}
}
v.push_back(width);
}
}
cout << v.size()<<"\n";
sort(v.begin(), v.end());
for(int i=0;i<v.size();i++)cout<<v[i]<<' ';
}
처음엔 따로 width를 주지 않고 vis[nx][ny]에 전의 값을 더해가며 vis[nx][ny]값을 사용하려고 했지만 내가 출력하려는 시점에서는 해당 값이 이미 변해버린 후였다. 아무튼. 큐를 비워가는 과정에서 상하좌우를 조사하는 nx, ny는 블록 밖으로 꺼내올 생각일랑 하지 말어라~
무지하게 헤맸구먼..ㅎㅎ풀이는 일찍 끝냈는데...좀 꼼꼼하게 조건이나 그런걸 생각하자ㅏ...침착하게 작성한 것이 가장 빠른 풀이이다.