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:走出迷宫并输出最小步数的主要内容,如果未能解决你的问题,请参考以下文章

bfs最短路与最小步数模型

为啥bfs走迷宫的路程是最小值而dfs就不一定

bfs

迷宫问题 (BFS ?输出路径)

迷宫问题_BFS_挑战程序设计竞赛p34

1254:走出迷宫