
数据:
Sample Input:
0 1 0 0 0
0 1 0 1 0
0 1 0 1 0
0 0 0 1 0
0 1 0 1 0
Sample Output
(0, 0)
(1, 0)
(2, 0)
(3, 0)
(3, 1)
(3, 2)
(2, 2)
(1, 2)
(0, 2)
(0, 3)
(0, 4)
(1, 4)
(2, 4)
(3, 4)
(4, 4)

#include <iostream>
#include <queue>
#include <stack>
using namespace std;
int a[5][5]; //存放地图的二维数组
queue<int> P; //用来记录所到达的点的坐标(看学长用的point,但我出问题了,就代替了)
queue<int> Q;
int dx[]={0,0,1,-1}; //移动的横坐标
int dy[]={1,-1,0,0}; //移动的纵坐标
int XX[5][5]; //每到达一个点记录其前一个点的坐标
int YY[5][5];
stack<int> L; //最后路径反向走一遍再输出得到结果
int main(){
ios::sync_with_stdio(false);
for(int i=0; i<5; i++){
for(int j=0; j<5; j ++){
cin>>a[i][j];
} //读入地图
}
P.push(0); //到达的点入队列
Q.push(0);
a[0][0]=1; //标记
while(!P.empty()){
int x;
int y;
int x1=P.front(); //取出点
P.pop();
int y1=Q.front();
Q.pop();
for(int i=0; i<4;i++){ //点进行移动
x=x1+dx[i];
y=y1+dy[i];
if(x>=0 && x<5 && y>=0 && y<5 && !a[x][y] ){//判断该点是否合法
XX[x][y]=x1; //记录前一个点的坐标
YY[x][y]=y1;
a[x][y]=1; //标记
P.push(x); //入队列
Q.push(y);
}
}
if(x==4 && y==4) break;//若到达出头则停止
}
a[4][4]=-1;
int x=4,y=4;
L.push(4);
L.push(4); //入栈
while(1){ //将得到的路径反向输出到栈中,得到正向路径
int m=XX[x][y];
int n=YY[x][y];
x=m;
y=n;
L.push(m);
L.push(n);
if(m==0 && n==0) break;
}
a[0][0]=-1;
while(!L.empty()){ //输出路径
int i=L.top();
L.pop();
int j=L.top();
L.pop();
cout<<"("<<j<<","<<" "<<i<<")"<<endl;
}
return 0;
}
想法:即从入口处通过bfs进行搜索,直到到达终点,结束搜索。其中注意点的移动,可用两个数组来实现上下左右的移动。在每到达一个点的时候,判断是否合法,即是否在地图外,或者这个点是否已经到达了,又或者是不是障碍。然后记录下每个点的前一个点的坐标,最后到达终点的时候,便可以通过反向遍历得到路径,其可以用栈来实现。
本文深入探讨了一种迷宫寻路算法,采用广度优先搜索(BFS)策略,详细讲解了如何从起点出发,寻找通往终点的最短路径。文章通过具体的代码示例,演示了算法的实现过程,包括点的移动、路径记录和最终路径的反向输出。适用于初学者理解和掌握迷宫寻路的基本原理。
1493





