有一天,小哈一个人去玩迷宫,但是他迷路了。现在你知道迷宫的地图需要去解救小哈。迷宫由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;
}
运行结果: