#include<iostream>
#include<cstdio>
using namespace std;
int a[51][51];
int book[51][51],n,m,sum;
void dfs(int x,int y,int color){
//定义一个方向数组
int next[4][2]={{0,1},//向右走
{1,0},//向下走
{0,-1},//向左走
{-1,0}//向上走
};
int k,tx,ty;
a[x][y]=color;//对a[x][y]这个格子进行染色
//枚举4个方向
for(k=0;k<=3;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;
}
/*想知道这个地图中有多少个独立的小岛,只需要对地图上的每一个大于0的点都进行一遍深度优先搜索即可*/
int main(){
int i,j,num=0;
cout<<"请输入n和m,n为行,m为列:"<<endl;
cin>>n>>m;
//读入地图
cout<<"请输入地图矩阵:"<<endl;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
cin>>a[i][j];
}
}
//对每一个大于0的点尝试进行dfs染色
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
if(a[i][j]>0){
num--;//小岛需要染的颜色的编号
//每发现一个小岛应染以不同的颜色,因此每次要-1
book[i][j]=1;
dfs(i,j,num);
}
}
}
cout<<endl<<endl<<"染色后的地图为:"<<endl;
//输出已经染色后的地图
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
printf("%3d",a[i][j]);//%3d中的3是C语言中的场宽
if(j==m){
cout<<endl;
}
}
}
//最后输出岛屿的个数
cout<<endl<<"岛屿个数为:"<<-num<<endl;
getchar();
return 0;
}