/*
#include <stdio.h>
#include <string.h>
#define size 201
int stack[size]={};
int top=-1;
void push(int data)
{
top++;
stack[top]=data;
}
int pop()
{
if (top==-1)
return 0;
return stack[top--];
}
int main()
{
char str[size]={};
int i,num=0,cal,a,b;
gets(str);
for (i=0;i<strlen(str);i++)
{
if (str[i]==' ') continue;
else if (str[i]>=48&&str[i]<=57)
{
num=num*10+(str[i]-48);
if (str[i+1]==' ')
{
push(num);
num=0;
}
}
else if (str[i]=='+')
{
cal=pop()+pop();
push(cal);
}
else if (str[i]=='-')
{
a=pop();
b=pop();
cal=b-a;
push(cal);
}
else if (str[i]=='*')
{
cal=pop()*pop();
push(cal);
}
}
printf("%d", pop());
return 0;
}
*/
/*
#include <stdio.h>
#include <string.h>
#define size 100001
int stack[size]={};
int top=-1;
void push(int data)
{
top++;
stack[top]=data;
}
int pop()
{
if (top==-1)
return 0;
return stack[top--];
}
int main()
{
char str[100001];
int i,n,sum=0;
scanf("%s",str);
for(i=0;i<strlen(str);i++)
{
if (str[i]=='(')
{
push(1);
}
else if(str[i-1]=='('&&str[i]==')')
{
pop();
sum+=top+1;
}
else
{
sum++;
pop();
}
}
printf("%d",sum);
return 0;
}
*///queue 구조 basic queue
/*
#include <stdio.h>
#include <string.h>
#define size 101
int queue[size];
int front=-1, rear=-1;
void enqueue(int data)
{
queue[++rear]=data;
}
int dequeue()
{
if (rear==front)
{
return 0;
}
return queue[++front];
}
int main()
{
int n,i,t;
scanf("%d", &n);
for (i=0;i<n;i++)
{
scanf("%d", &t);
enqueue(t);
}
for (i=0;i<n;i++)
{
printf("%d ", dequeue());
}
return 0;
}
//circular queue
#include <stdio.h>
#include <string.h>
#define size 101
int queue[size];
int front=-1, rear=-1;
void enqueue(int data)
{
if((rear+1)%size==front)
return ;
rear=(rear+1)%size;
queue[rear]=data;
}
int dequeue()
{
if (rear!=front)
{
front=(front+1)%size;
return queue[front];
}
return 0;
}
int main()
{
int n,i,t;
scanf("%d", &n);
for (i=0; i<n; i++)
{
scanf("%d", &t);
enqueue(t);
}
while(rear!=front)
{
printf("%d ", dequeue());
}
return 0;
}
*/
//dfs stack
/*
#include <stdio.h>
#include <string.h>
#define size 101
int stack[size]= {};
int top=-1;
int map[size][size]= {};
int visited[size]= {};
void push(int data)
{
top++;
stack[top]=data;
}
int pop()
{
return stack[top--];
}
int main()
{
int p,q,m, i, j,t,sum=0,n;
scanf("%d",&n);
scanf("%d", &m);
for (i=0; i<m; i++)
{
scanf("%d %d", &p,&q);
map[p][q]=1;
map[q][p]=1;
}
t=1;
visited[1]=1;
do
{
for(i=1; i<=n; i++)
{
if (map[t][i]==1 && visited[i]==0)
{
push(t);
visited[i]=1;
t=i;
break;
}
}
if(i==n+1)
t=pop();
}while(top>=-1);
for(i=1;i<=n;i++)
{
printf("%d ",visited[i]);
}
for(i=2;i<=n;i++)
{
sum+=visited[i];
}
printf("\n%d",sum);
return 0;
}
*/
//dfs recursive virus
/*
#include <stdio.h>
#include <string.h>
#define size 101
int map[size][size]= {};
int visited[size]= {};
int n;
void dfs(int t)
{
int i;
visited[t]=1;
for(i=1; i<=n; i++)
{
if (map[t][i]==1 && visited[i]==0)
{
dfs(i);
}
}
}
int main()
{
int i,p,q,m,sum=0;
scanf("%d",&n);
scanf("%d", &m);
for (i=0; i<m; i++)
{
scanf("%d %d", &p,&q);
map[p][q]=1;
map[q][p]=1;
}
dfs(1);
for(i=1; i<=n; i++)
{
printf("%d ",visited[i]);
}
for(i=2; i<=n; i++)
{
sum+=visited[i];
}
printf("%d",sum);
return 0;
}
*/
#include <stdio.h>
#include <string.h>
#define size 26
int map[size][size]={};
int n;
void maprint()
{
int i,j;
for (i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
printf("%d ", map[i][j]);
}
printf("\n");
}
}
void dfs(int i, int j)
{
if(i>=1 && i<=n && j>=1 && j<=n && map[i][j]!=1) return ;
map[i][j]=-1;
maprint();
printf("\n");
dfs(i-1,j);
dfs(i+1,j);
dfs(i,j+1);
dfs(i,j-1);
}
int main()
{
int i,j,cnt=0;
scanf("%d", &n);
for (i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
scanf("%1d", &map[i][j]);
}
}
for (i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(map[i][j]==1)
{
dfs(i,j);
cnt++;
}
}
}
maprint();
printf("\n%d",cnt);
return 0;
}