less than 1 minute read

2667

#include <cstdio>
using namespace std;
const int MAX = 25;

int n;
int mat[MAX][MAX];
int marked[MAX][MAX];
int cnt = 0;
int cntArr[MAX*MAX];

void dfs(int x, int y);
int main() {
	int i, j, tmp;
	scanf("%d", &n);
	
	for (i=0;i<n;i++){
		for(j=0;j<n;j++) {
			scanf("%1d", &mat[i][j]);
			marked[i][j] = 0;
			cntArr[(i*j)+j] = 0;
		}
	}
	
	for (i=0;i<n;i++){
		for(j=0;j<n;j++) {
			if (mat[i][j] && (!marked[i][j])) {
				cnt++;
				dfs(i,j);
			}
		}
	}
	
	printf("%d\n", cnt);
	
	for (i=1; i<=cnt; i++) {
		for(j=i+1;j<=cnt;j++) {
			if(cntArr[i] > cntArr[j]) {
				tmp = cntArr[i];
				cntArr[i] = cntArr[j];
				cntArr[j] = tmp;
			}
		}
	}
	for (i=1;i<=cnt;i++) {
		printf("%d\n", cntArr[i]);
	}
	
	return 0;
}

void dfs(int x, int y) {
	int i, j;
	
	marked[x][y] = cnt;
	cntArr[cnt]++;
	
	if ((x!=0) && mat[x-1][y] && (!marked[x-1][y])) {
		dfs(x-1, y);
	}
	if ((x!=n-1) && mat[x+1][y] && (!marked[x+1][y])) {
		dfs(x+1, y);
	}
	if ((y!=0) && mat[x][y-1] && (!marked[x][y-1])) {
		dfs(x, y-1);
	}
	if ((y!=n-1) && mat[x][y+1] && (!marked[x][y+1])) {
		dfs(x, y+1);
	}
}

Categories:

Updated: