#include<stdio.h>
int a[51][51],n,m,sum,book[51][51];
void dfs(int x,int y,int color)
{
int tx,ty,k;
int next[4][2]= {{0,1}, //向右走
{1,0}, //向下走
{0,-1}, //向左走
{-1,0}
}; //向上走
a[x][y]=color; //对a[x][y]这个格子进行染色
for(k=0; k<4; k++)
{
tx=x+next[k][0];
ty=y+next[k][1];
//判断是否越界
if(tx<1||tx>n||ty<1||ty>m)
continue;
//判断是否是陆地
if(a[tx][ty]>0&&book[tx][ty]==0)
{
sum++;
book[tx][ty]=1; //标记这个点已经走过
dfs(tx,ty,color); //开始尝试下一个点
}
}
return;
}
int main()
{
int i,j,num=0;
scanf("%d%d",&n,&m);
//读入地图
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
scanf("%d",&a[i][j]);
//对每一个大于0的点进行dfs染色
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
{
if(a[i][j]>0)
{
num--;
book[i][j]=1;
dfs(i,j,num);
}
}
//输出染色后的地图
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
{
printf("%3d ",a[i][j]); //%3中的3是C语言中的场宽
}
printf("\n");
//输出小岛的个数
printf("有%d个小岛\n",-num);
return 0;
}