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