#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node{//各个位置的坐标,距起点距离用结构体封装起来
int x;
int y;
int distance;
};
struct node queue[100];//队列实现BFS
int head=0,tail=0;
int map[51][51];//存图
int book[51][51];//标记走过的点
int n;//图的规模
int locx,locy;//小哈位置 //假设小哼位于(1,1)
int next[4][2]={{-1,0},{1,0},{0,-1},{0,1}};//当前位置的下一位置的坐标选择
int bfs(int x,int y)//x,y为当前head的坐标,bfs为以当前head为基础进行queue拓展,即广搜
{
if(x==locx&&y==locy){
return queue[head].distance;
}
for(int i=0;i<4;i++){//依次看看上下左右符不符合情况
int xnext=x+next[i][0];
int ynext=y+next[i][1];
if(xnext>=1&&xnext<=n&&ynext>=1&&ynext<=n&&map[xnext][ynext]==1&&book[xnext][ynext]==0){
book[xnext][ynext]=1;
queue[tail].x=xnext;
queue[tail].y=ynext;
queue[tail].distance=queue[head].distance+1;
tail++;
}
}
head++;//当前head广搜完,head后移
return bfs(queue[head].x,queue[head].y);
}
int main()
{
//初始化book数组
for(int i=0;i<=50;i++)
memset(book[i],0,sizeof(book[i]));
scanf("%d",&n);
scanf("%d%d",&locx,&locy);
//读入map,非障碍物存1
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&map[i][j]);
//初始化队列
queue[tail].x=1;
queue[tail].y=1;
queue[tail].distance=0;
tail++;
book[1][1]=1;
int min=bfs(1,1);
printf("%d\n",min);
return 0;
}
啊哈算法BFS应用之解救小哈
最新推荐文章于 2022-04-24 18:53:41 发布