和之前不用的地方是:题目自动选择了一个点,要求从这个点的周围来寻找连接的部分。所有不需要比较哪个点更合适,能找到的可以连接的地方更多。
代码如下:
/*宝岛探险-bfs*/
#include <stdio.h>
struct node
{
int x;
int y;
} ;
int main()
{
struct node que[10005];
int head,tail;
int a[101][101];
int book[101][101] = {0};
int i,j,k,sum = 0,n,m,startx,starty,tx,ty;
int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//搜索的方向,右,下,左,上
scanf("%d%d%d%d",&n,&m,&startx,&starty);
for(i = 1;i <= n;i++)
{
for(j = 1;j <= m;j++)
{
scanf("%d",&a[i][j]);
}
}
head = 1;
tail = 1;
que[tail].x = startx;
que[tail].y = starty;
tail++;
book[startx][starty] = 1;
sum = 1;//降落的点也是一个岛屿
while(head<tail)
{
for(k = 0;k < 4;k++)
{
tx = que[head].x +next[k][0];
ty = que[head].y + next[k][1];
if(tx<1||tx>n||ty<1||ty>m)
{
continue;
}
if(a[tx][ty]>0&&book[tx][ty]==0)//是小岛同时未标记过
{
book[tx][ty] = 1;
que[tail].x = tx;
que[tail].y = ty;
tail++;
sum++;
}
}
head++;
}
printf("%d\n",sum);
return 0;
}