/*
#include <stdio.h>
int arr[1000][1000]={};
int n;
int dir[4][2]={-1,0,+1,0,0,+1,0,-1};
void dfs(int i, int j, int k)
{
if(arr[i][j]<k || i<=0 || j<=0 || i>n || j>n) return ;//범위넘거나 0이라면
arr[i][j]=0;
for(int a=0;a<4;a++)
dfs(i+dir[a][0],j+dir[a][1],k);
}
int main()
{
int cnt=0,max=1,brr[101][101]={};
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%d",&arr[i][j]);
brr[i][j]=arr[i][j];
}
}
for(int k=1;k<=100;k++)
{
//k이하인 지점이 잠길때의 영역개수
cnt=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(arr[i][j]>=k)
{
cnt++;
dfs(i,j,k);
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
arr[i][j]=brr[i][j];
}
if(max<cnt)
max=cnt;
}
printf("%d",max);
return 0;
}
*/
/*
#include <stdio.h>
char arr[10001][10001]={};
int m,n;
int dir[4][2]={-1,0,+1,0,0,+1,0,-1};
void dfs(int i, int j) //1 일떄
{
if( arr[i][j]!=1 || i<=0 || j<=0 || i>m || j>n) return ;//범위넘거나 0이라면
arr[i][j]=2;
for(int k=0;k<4;k++)
dfs(i+dir[k][0],j+dir[k][1]);
}
void fs(int i, int j) //0 일때
{
if(arr[i][j]!=0 || i<=0 || j<=0 || i>m || j>n) return ;//범위넘거나 0이라면
arr[i][j]=2;
for(int k=0;k<4;k++)
fs(i+dir[k][0],j+dir[k][1]);
}
//void view()
//{
// for(int i=1;i<=m;i++)
// {
// for(int j=1;j<=n;j++)
// {
// printf("%d ",arr[i][j]);
// }
// printf("\n");
// }
// printf("\n");
//}
int main()
{
int cnt=0,f=0;
scanf("%d %d",&m,&n);
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%d",&arr[i][j]);
}
}
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
if(arr[i][j]==1)
{
cnt++;
dfs(i,j);
// printf("a: %d %d\n",i,j);
// view();
}
else if(arr[i][j]==0)
{
f++;
fs(i,j);
// printf("b: %d %d\n",i,j);
// view();
}
}
}
printf("%d %d",f,cnt);
return 0;
}
#include <stdio.h>
char arr[362][362]={};
int dir[4][2]={+1,0,0,+1,-1,+1,+1,+1};
int t=0,e=0;
void dfs(int i, int j,int k) //1 일떄
{
if( i<=0 || j<=0 || i>19 || j>19 ||arr[i][j]!=1) return ;//범위넘거나 0이라면
t++;
dfs(i+dir[k][0],j+dir[k][1],k);
}
void fs(int i, int j,int k) //2 일때
{
if(arr[i][j]!=2 || i<=0 || j<=0 || i>19 || j>19) return ;//범위넘거나 0이라면
e++;
fs(i+dir[k][0],j+dir[k][1],k);
}
int main()
{
int cnt=0,f=0;
int a,b,c,d;
for(int i=1;i<=19;i++)
{
for(int j=1;j<=19;j++)
{
scanf("%d",&arr[i][j]);
}
}
for(int i=1;i<=19;i++)
{
for(int j=1;j<=19;j++)
{
if(arr[i][j]==1)
{
for(int k=0;k<4;k++)
{
t=1;
dfs(i+dir[k][0],j+dir[k][1],k);
if(t==5)
{
if(arr[i-dir[k][0]][j-dir[k][1]]!=1 )
{
printf("1\n%d %d",i,j);
return 0;
}
}
}
}
else if(arr[i][j]==2)
{
for(int k=0;k<4;k++)
{
e=1;
fs(i+dir[k][0],j+dir[k][1],k);
if(e==5)
{
if(arr[i-dir[k][0]][j-dir[k][1]]!=2)
{
printf("2\n%d %d",i,j);
return 0;
}
}
}
}
}
}
printf("0");
return 0;
}
*/
#include <stdio.h>
int que[2][700]={};
int rear=-1,front=-1;
int px,py;
//enqueue dequeue
int arr[27][27]={},n;
int danji[500]={};
int a=0;
void push(int x, int y)
{
// 범위에서 안나가고, 1이라면
if(x<=0 ||y<=0 ||x>n || y>n ||arr[x][y]!=1)
//방문체크
arr[x][y] = 0;
rear++;
que[0][rear]=x;
que[1][rear]=y;
}
void pop()
{
front++;
px = que[0][front];
py = que[1][front];
}
void bfs(int i, int j)
{
while(rear!=front)
{
pop();
for()
{
// pop한 x와 y 주변 4칸중 갈 수 있는 곳을 push,체크
push();
}
}
}
int main()
{
int cnt=0,temp;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%1d",&arr[i][j]);
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(arr[i][j]==1)
{
cnt++;
push(i,j);
bfs();
}
}
}
printf("%d\n",cnt);
// 정렬
for(int i=1; i<cnt; i++)
{
for(int j=1;j<=cnt-i;j++)
{
if (danji[j] > danji[j+1])
{
temp = danji[j];
danji[j] = danji[j+1];
danji[j+1] = temp;
}
}
}
for(int i=1;i<=cnt;i++)
printf("%d\n",danji[i]);
return 0;
}