#include <stdio.h> #pragma warning(disable:4996) int m, n, k, a, b, c, d; int map[105][105]; int cnt_num; // 영역 개수 저장 int size[10001], cnt_size; // 영역 크기 저장, 영역 사이즈 int x[] = { 0, 1, 0, -1 }; int y[] = { -1, 0, 1, 0 }; void algo(int posy, int posx); int main() { FILE *fin = fopen("input.txt", "rt"); FILE *fout = fopen("output.txt", "wt"); fscanf(fin, "%d %d %d", &m, &n, &k); for (int i = 1; i <= m; i++) for (int j = 1; j <= n; j++) map[i][j] = 1; for (int i = 1; i <= k; i++) { fscanf(fin, "%d %d %d %d", &a, &b, &c, &d); // 바로 영역 채우기 for (int i0 = b+1; i0 <= d; i0++) { for (int j = a+1; j <= c; j++) { if (map[i0][j] == 2) continue; map[i0][j] = 2; } } } // test print /*for (int i = 0; i <= m + 1; i++) { for (int j = 0; j <= n + 1; j++) { printf("%2d ", map[i][j]); } printf("\n"); }*/ for (int i = 1; i <= m; i++) { for (int j = 1; j <= n; j++) { if (map[i][j] == 1) { cnt_num++; cnt_size = 0; algo(i, j); size[cnt_num] = cnt_size; // test print /*printf("\n"); for (int i = 0; i <= m + 1; i++) { for (int j = 0; j <= n + 1; j++) { printf("%2d ", map[i][j]); } printf("\n"); } printf("현재까지 영역 개수는 %d 영역%d의 넓이는 %d",cnt_num, cnt_num,size[cnt_num] ); printf("\n");*/ } } } // bubble sort for (int i = 1; i <= cnt_num; i++) { for (int j = 1; j <= cnt_num - i; j++) { if (size[j] > size[j+1]) { int tmp = size[j]; size[j] = size[j + 1]; size[j + 1] = tmp; } } } // print fprintf(fout, "%d\n", cnt_num); for (int i = 1; i <= cnt_num; i++) fprintf(fout, "%d ", size[i]); fprintf(fout, "\n"); } void algo(int posy, int posx) { map[posy][posx] = 2; // 갔다는 표시 cnt_size++; for (int i = 0; i < 4; i++) { if (map[posy + y[i]][posx + x[i]] == 2 || map[posy + y[i]][posx + x[i]] == 0) continue; else if (map[posy + y[i]][posx + x[i]] == 1) algo(posy + y[i], posx + x[i]); } } |