广度优先搜索之宝岛探险

来源:互联网 发布:java wait的用法 编辑:程序博客网 时间:2024/04/29 18:58

        对于一个矩阵,某一点的值代表是陆地,求初始一个点的小岛面积,即连起来的有多少个不孤立的点。

#include<stdio.h>struct note{int x;int y;};int main(){struct note que[2501];int head, tail;int a[51][51];int book[51][51] = { 0 };//标记是否走过,1代表走过,0代表未走int i, j, k, tx, ty, sum, max = 0, startx, starty, mx, my,n,m;int next[4][2] = { {0,1}, {1,0}, {0,-1}, {-1,0} };scanf_s("%d %d %d %d", &n, &m, &startx, &starty);for (i = 1; i <= n;i++) for (j = 1; j <= m;j++)scanf_s("%d", &a[i][j]);head = 1, tail = 1;//init the queueque[tail].x = startx, que[tail].y = starty;tail++;book[startx][starty] = 1;sum = 1;while (head < tail)//队列不为空的时候循环{for (k = 0; k <= 3; 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)//判断是否是陆地且是否被走过{sum++;book[tx][ty] = 1;//每个点只入队一次,标记改点已经走过que[tail].x = tx;//将新的点入队列que[tail].y = ty;tail++;}}head++;//每一个点枚举完四个方向该点就出队列}printf_s("%d\n", sum);getchar();return 0;}


0 0
原创粉丝点击