bfs

有一天,小哈一个人去玩迷宫,但是他迷路了。现在你知道迷宫的地图需要去解救小哈。迷宫由n行m列组成(m,n<=50),每个单元格可能是空地或者障碍物。你要找一条解救小哈的最短路径。

#include <iostream>
 
using namespace std;
/* 5行4列 5 4 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 */ 
struct note{
		int x;
		int y;
		int step;
	};
	
int main()
{
	struct note queue[2501]; //因为地图大小不超过50*50,所以队列不超过2500
	int visited[50][50]={0};
	int a[50][50]={0}; //存储地图
	int flag=0; //用来标记是否到达目标位置 
	int m,n,tx,ty;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>a[i][j];
		}
	}
   	int next[4][2]{{1,0},{0,1},{-1,0},{0,-1}}; 
   	int startx=1,starty=1;//查找起始位置 
   	int p=4,q=3; //目标所在位置 
   	//队列初始化 
   	int head=1,tail=1;
   	queue[tail].x=startx;
   	queue[tail].y=starty;
   	queue[tail].step=0;
   	tail++;
   	visited[startx][starty]=1;
   	
 	while(head<tail){
 		for(int k=0;k<4;k++){
 			//计算下一个点 
 			tx = queue[head].x+next[k][0];
 			ty = queue[head].y+next[k][1];
 			//判断该下个点是否越界
			 if(tx<1 || tx>n || tx<1 || ty>m){
			 	continue;
			 } 
			 
			 //判断是否为障碍物或者已经在队列中
			 if(visited[tx][ty]==0&&a[tx][ty]==0) {
			 	//将该点标记为走过
				 visited[tx][ty]=1;//与dfs不同的是这里后面不需要将其返回为0,每个点只入队一次
				 //将该点插入到队列中
				 queue[tail].x=tx;
				 queue[tail].y=ty;
				 queue[tail].step=queue[head].step+1;
				  tail++;
			 }
			 if(tx==p&&ty==q){
			 	flag=1;
			 	break;
			 }
 		}
 		if(flag==1)
 			break;
 		head++;
 	} 
 	cout<<queue[tail-1].step;
    return 0;
}

运行结果:
在这里插入图片描述