广度优先搜索(wfs)模板
#include <stdio.h>
#include <iostream>
using namespace std;
struct note{
int x;
int y;
};
int main()
{
note que[2501];//que作为存放所走过的每一个中心点,即岛屿面积
int head,tail;//head,tail作为评判标准;判断是否将此区域的所有岛屿小格子遍历完
int a[51][51];//用来记录地图的情况
int book[51][51]={0};//用来标记是否走过这块区域
int sum,max=0,startx,starty;//sum用于计算所降落的岛屿的面积,startx与starty是刚降落的坐标位置
int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//定义一个方向坐标,向上走,向右走,向下走,向左走
cin >> n >> m >> startx >> starty//n为整个海域地图的行数,m为整个海域地图的列数
for(int i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cin >> a[i][j];
}
} //读入地图
head=1;//正在使用的中心点
tail=1;//tail用来标记遍历的周边,将未走过的地方加入队列,作为以后的中心点
que[tail].x=startx;
que[tail].y=starty;//往队列中插入降落的起始坐标
tail++;
book[startx][starty]=1;//将降落的面积标记为已走过
sum=1;//将降落的位置计入小岛面积
while(head<tail)
{
for(int i=0;i<=3;i++)
{
tx=que[head].x+next[i][0];
ty=que[head].y+next[i][1];//tx,ty分别为所要遍历的四周点的坐标
if(tx<1||tx>n||ty<1||ty>m)
{
continue;
} //判断是否越界
if(a[tx][ty]>0&&book[tx][ty]==0)//判断是否为没走过的陆地
{
sum++;
book[tx][ty]=1;
que[tail].x=tx;
que[tail].y=ty;//若为没走过的陆地,将下一个中心点定为此处(或者说暂时先加入队列)
tail++;
}
}
head++;//继续下一个扩展点
}
cout << sum;
return 0;
}