解题思路
首先明确题目要求,要求寻找最短路径。解决迷宫的问题思路主要为BFS(广度优先搜索)与DFS(深度优先搜索),而本题目显然适用于BFS,这样我们可以直观的比较出相同的步数条件下,谁会先到终点,这样的出来的即为最短路径。使用BFS,那么我们需要使用队列,即先进先出结构。
解题代码
#include<bits/stdc++.h>
using namespace std;
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
int ans=-1;
struct point{ //迷宫的点
int x;
int y;
int step;
};
class migong{
private:
point start;
point end;
int maze[105][105]={0};//迷宫
int n,m;
queue<point>q;//创建队列q
public:
void fuzhi();//对migong的实例化进行赋值与初始化
void bfs();//广度优先搜索
};
void migong::fuzhi(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>maze[i][j];
}
}
cin>>start.x>>start.y>>end.x>>end.y;
start.step=0;
maze[start.x][start.x]=-1;//使用-1标记我们走过的点
q.push(start);//赋值完成后,将起点入队 ,完成初始化
}
void migong::bfs(){
while(!q.empty()){//如果队列为空,那么该迷宫不存在解,停止循环
int x=q.front().x;
int y=q.front().y;//取出队列头部的点的信息
if(x==end.x&&y==end.y){
//如果队列头部的点到达了终点,即为有解且该解为最短路径
ans=q.front().step;
break;
}
for(int i=0;i<4;i++){//遍历上下左右四个方向
if(maze[x+dx[i]][y+dy[i]]==1&&(x+dx[i])>=1&&(y+dy[i])>=1
&&(x+dx[i])<=n&&(y+dy[i])<=m){
//寻找四个方向上满足条件的点
maze[x+dx[i]][y+dy[i]]=-1;//标记该点走过
start.x=x+dx[i];
start.y=y+dy[i];
start.step=q.front().step+1;
q.push(start);//将该点入队到队列的尾部
}
}
q.pop();//将队列头部出栈
}
cout<<ans;
}
int main(){
migong maze1;
maze1.fuzhi();
maze1.bfs();
return 0;
}