这是一道经典的bfs搜索题目,前几年蓝桥杯酷爱出这种题目,我记着2019年就B组就出过一道走迷宫题,不过那道题可以拿Excel走出来。下面我们对这道题目进行分析,先开一个二维数组定义可能走的路径,用结构体来确定带点的坐标和步长,写bfs时通过引入队列来进行搜索,再结合标记数组将访问过的路径置为1(true),未访问过的看作0,最后判断入栈,最终得出结果。贴上代码。
#include<iostream>
#include<queue>
using namespace std;
const int N=110;
int a[N][N];
int vis[N][N]; //标记数组,是否路径已经被范围过
int n,m;
int x1,y1,x2,y2; //定义入口和出口的位置
int p[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; //定义可能的移向位置
struct node //定义结构体 ,定义位置坐标和步长
{
int x,y,step;
};
bool check(int x,int y)
{
if(x<1||x>n||y<1||y>m || vis[x][y] || !a[x][y])
return false;
else
return true;
}
int bfs(int x,int y)
{
queue<node> que;
que.push(node{x,y,0}); //队列入队迷宫的起点
vis[x][y]=1; //标记这条路已经走过
while(!que.empty())
{
node u=que.front(); //取出队列的队首元素
que.pop(); //出队
if(u.x==x2&&u.y==y2) //已经走完了迷宫
{
return u.step;
}
for(int i=0;i<=3;i++) //可以走四个方向
{
int move1=u.x+p[i][0];
int move2=u.y+p[i][1];
if(!check(move1,move2))
{
continue;
}
vis[move1][move2]=true;
que.push( node{move1,move2,u.step+1} );
}
}
return -1;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
cin>>x1>>y1>>x2>>y2;
cout<<bfs(x1,y1)<<endl;
return 0;
}
问题得到结局。