题目描述:
输入n行m列二进制来描述一副地图,1代表陆地,0代表海水。如果横列或者竖列相连代表它们同属于一块陆地。
请实现计算陆地个数的算法,示例如下:
输入:
5 4
1 0 1 0
1 1 1 1
1 0 0 0
0 1 0 1
0 0 0 1
输出:
3
矩阵中1代表陆地,0代表海水。我们以行优先的方式遍历整个数组,找到一块陆地后,从找到这块陆地的起点开始,不停递归遍历它的上下左右四个方向,遇到陆地的位置就把它变为海水,每遍历一块陆地count++,最后返回陆地数。
代码如下:
#include<iostream>
using namespace std;
//陆地元素转换海水
void convert(int map[][100],int row,int col,int i,int j){
if(j-1>=0&&map[i][j-1]==1){ //向左边走
map[i][j-1]=0;
convert(map,row,col,i,j-1);
}
if(j+1<col&&map[i][j+1]==1){ //向右走
map[i][j+1]=0;
convert(map,row,col,i,j+1);
}
if(i-1>=0&&map[i-1][j]==1){ //向上边走
map[i-1][j]=0;
convert(map,row,col,i-1,j);
}
if(i+1<row&&map[i+1][j]==1){ //向下走
map[i+1][j]=0;
convert(map,row,col,i+1,j);
}
}
//返回陆地数
int getIslandCount(int map[][100],int row,int col){
int count=0;
for(int i=0;i<row;i++)
for(int j=0;j<col;j++){
if(map[i][j]==1){
map[i][j]=0; //找到这块陆地的起点置0
convert(map,row,col,i,j); //遍历这块陆地并置0
count++; //陆地数++
}
}
return count;
}
int main(){
int row=0; //行
int col=0; //列
cin>>row>>col;
int map[100][100];
for(int i=0;i<row;i++)
for(int j=0;j<col;j++)
cin>>map[i][j];
cout<<getIslandCount(map,row,col);
}
制作不易,多多点赞(●'◡'●)!