评论

收藏

[C++] C++广度优先算法应用题——计算岛屿面积

编程语言 编程语言 发布于:2021-12-30 16:43 | 阅读数:599 | 评论:0

DSC0000.png

DSC0001.png

DSC0002.png
测试数据如下:

6 6 3 4
0 1 0 1 1 0
0 0 0 1 1 1
1 0 1 1 0 1
0 0 0 1 0 0
0 1 1 1 1 0
0 0 0 0 0 0
//Author:PanDaoxi 
#include <iostream>
using namespace std;
//定义结构体
struct node{
  int x,y;
}que[1001];
int head=1,tail=1; 
//头指针、尾指针分别对应当前搜索对象的下标和下个元素的位置
int m,n,x,y,map[101][101]; //m,n地图行、列 x,y小童位置的坐标
int sum=0; //计数器:岛屿的面积 
//搜索方向
int next[4][2]={{-1,0},{0,1},{1,0},{0,-1}}; 
void bfs(){
  //第一个搜索的点 
  que[tail].x=x;
  que[tail].y=y;
  map[x][y]=0;
  tail++;
  //更新岛屿面积
  sum++;
  //广搜核心代码
  while(head<tail){
  for(int i=0;i<=3;i++){
    int tx=que[head].x+next[i][0],
    ty=que[head].y+next[i][1];
    //判断是否可以通过
    if(tx<1||tx>m||ty<1||ty>n) continue;
    //判断是否为陆地
    if(map[tx][ty]==1){
    que[tail].x=tx;
    que[tail].y=ty; 
    tail++;
    map[tx][ty]=0;
    sum++;
    } 
  }
  //搜索完以后
  head++; 
  } 
}
int main(){
  //输入地图行列、小童的坐标 
  cin>>m>>n>>x>>y;
  for(int i=1;i<=m;i++){
  for(int j=1;j<=n;j++){
    cin>>map[i][j];
  }
  }
  //广度优先搜索
  bfs();
  //输出信息
  cout<<sum<<endl; 
  return 0;
}
DSC0003.png







关注下面的标签,发现更多相似文章