알고리즘 문제/백준(BOJ)
[백준 2583번] 영역 구하기_C++
집돌이탈출
2019. 2. 17. 15:43
[소스 코드]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | #include <iostream> #include <queue> #include <algorithm> using namespace std; #define MAX 100 int N, M, K; int map[MAX][MAX]; int num[MAX]; bool visited[MAX][MAX]; int dir[4][2] = { {0,1}, {0,-1}, {1,0}, {-1,0} }; typedef struct _node { int row; int col; int cnt; }Node; void SetMap(Node leftDown, Node rightUp) { for (int i = rightUp.row; i < leftDown.row; i++) { for (int j = leftDown.col; j < rightUp.col; j++) { map[i][j] = -1; } } } bool isBoundary(int row, int col) { return (row >= 0 && row < M) && (col >= 0 && col < N); } void Solve(int r, int c, int cc) { queue<Node> q; q.push(Node{ r, c }); visited[r][c] = true; map[r][c] = cc; num[cc] += 1; while (!q.empty()) { Node node = q.front(); q.pop(); int row = node.row; int col = node.col; int cnt = node.cnt; for (int i = 0; i < 4; i++) { int nr = row + dir[i][0]; int nc = col + dir[i][1]; if (isBoundary(nr, nc) && !visited[nr][nc] && map[nr][nc] != -1) { visited[nr][nc] = true; map[nr][nc] = cnt; num[cc] += 1; q.push(Node{ nr,nc,cnt }); } } } } int main(void) { cin >> M >> N >> K; for (int i = 0; i < K; i++) { int lr, lc, rr, rc; cin >> lr >> lc >> rr >> rc; Node leftDown = Node{ M - lc, lr,0 }; Node rightDown = Node{ M - rc, rr,0 }; SetMap(leftDown, rightDown); } int ans = 1; for (int i = 0; i < M; i++) { for (int j = 0; j < N; j++) { if (map[i][j] != -1 && !visited[i][j]) { Solve(i, j, ans); ans += 1; } } } cout << ans - 1 << endl; sort(num+1, num + ans); for (int i = 1; i <= ans - 1; i++) { cout << num[i] << " "; } cout << endl; return 0; } | cs |