BFS:走出迷宫并输出最小步数
Posted CSU迦叶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BFS:走出迷宫并输出最小步数相关的知识,希望对你有一定的参考价值。
目录
背景
描述
给定一个n*m大小的迷宫,其中*代表不可通过的墙壁,而“.”代表墙壁,S表示起点,T代表重点。移动过程中,如果当前位置是(x,y)(下标从0开始),且每次只能前往上下左右(x,y+1),(x,y-1),(x-1,y),(x+1,y)四个位置的平地,求从起点S到达终点T的最少步数。
例子
. . . . .
. * . * .
. * S * .
. * * * .
. . . T *
上面的例子中,起点S的坐标是(2,2),终点T的坐标是(4,3),最少步数为11。
思路
由于BFS是通过层次顺序来遍历,可以从起点开始记遍历的层数,到终点时遍历的层数即为步数。
完整代码
#include<cstdio>
#include<map>
#include<set>
#include<string>
#include<cstring>
#include<iostream>
#include<vector>
#include<stack>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn = 100;
struct Node{
int x,y;//坐标(x,y)
int step = 0;//是层数也是步数
}S,T,node;//分别是起点、终点、临时结点
int n,m;//行和列
char maze[maxn][maxn];//存放迷宫的路况
bool inq[maxn][maxn] = {false};//是否已经入过BFS的队列
int X[4] = {0,0,-1,1};//增量数组
int Y[4] = {1,-1,0,0};
//判断当前位置是否能够入队
bool judge(int x,int y){
//越界,不行
if(x<0||x>=n||y<0||y>=m)return false;
//碰壁,也不行
if(maze[x][y]=='*')return false;
//已经入过了,不行
if(inq[x][y])return false;
return true;
}
//BFS函数的任务是返回到达终点所走步数,如果到达不了就返回-1
int BFS(){
queue<Node> que;//定义队列
que.push(S);//起点入队
while(!que.empty()){
Node top = que.front();//取出队首元素
que.pop();//队首元素出队
if(top.x == T.x&&top.y == T.y)return top.step;//抵达了终点,返回步数
for(int i=0;i<4;i++){
int newX = top.x + X[i];
int newY = top.y + Y[i];
if(judge(newX,newY)){//判断是否能够入队
node.x = newX;
node.y = newY;
node.step = top.step+1;//因为node是top的下一层结点
que.push(node);//node入队
inq[newX][newY] = true;//设置node已经入队
}
}
}
return -1;
}
int main(){
scanf("%d%d",&n,&m);
getchar();//吸收换行符
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
scanf("%c",&maze[i][j]);
getchar();
}
}
scanf("%d%d%d%d",&S.x,&S.y,&T.x,&T.y);
printf("%d\\n",BFS());
return 0;
}
收获总结
1. 要知道把最少步数和BFS联系在一起,并在结点结构体里加层数(也是步数)step属性
2. BFS必备:队列,判断函数
3. 矩阵题必备:增量数组,判断函数
以上是关于BFS:走出迷宫并输出最小步数的主要内容,如果未能解决你的问题,请参考以下文章