当前位置:网站首页>走迷宫 BFS
走迷宫 BFS
2022-08-03 22:35:00 【小艾菜菜菜】
题目描述
给定一个n*m的二维整数数组,用来表示一个迷宫,数组中只包含0或1,其中0表示可以走的路,1表示不可通过的墙壁。
最初,有一个人位于左上角(1, 1)处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。
请问,该人从左上角移动至右下角(n, m)处,至少需要移动多少次。
数据保证(1, 1)处和(n, m)处的数字为0,且一定至少存在一条通路。
输入格式
第一行包含两个整数n和m。
接下来n行,每行包含m个整数(0或1),表示完整的二维数组迷宫。
输出格式
输出一个整数,表示从左上角移动至右下角的最少移动次数。
数据范围
1≤n,m≤100
样例
5 5
0 1 0 0 0
0 1 0 1 0
0 0 0 0
0 1 1 1 0
0 0 0 1 0
样例输出
8
解题思路:
没有什么特别的技巧,使用广度优先遍历暴力搜索即可。
具体怎么个搜索方式呢,请看下面的这张图:

具体的代码实现
我这里使用到了队列,其中我会以手写实现队列的方式,与直接使用C++ STL的queue 来编写代码来解决这道题
数组模拟队列实现:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 110;
typedef pair<int, int> PII;
int n, m;
int g[N][N];//存放地图
int d[N][N];//存 每一个点到起点的距离
PII q[N * N];//手写队列
int bfs()
{
int hh = 0, tt = 0;
q[0] = {
0, 0};
memset(d, - 1, sizeof d);//距离初始化为- 1表示没有走过
d[0][0] = 0;//表示起点走过了
int dx[4] = {
-1, 0, 1, 0}, dy[4] = {
0, 1, 0, -1}; //x 方向的向量和 y 方向的向量组成的上、右、下、左
//要是没太懂上面的控制方向用的小技巧,可以在草稿纸上以[0,0]为例,以(x,y) = (-1,0) 一一对应的来实现以下上下左右,就很很明白了
while(hh <= tt)//队列不空
{
PII t = q[hh ++ ];//取队头元素
for(int i = 0; i < 4; i ++ ) //枚举4个方向
{
int x = t.first + dx[i], y = t.second + dy[i];//x表示沿着此方向走会走到哪个点
if(x >= 0 && x < n && y >= 0 && y < m && g[x][y] == 0 && d[x][y] == -1)//在边界内 并且是空地可以走 且之前没有走过
{
d[x][y] = d[t.first][t.second] + 1;//到起点的距离
q[ ++ tt ] = {
x, y};//新坐标入队
}
}
}
return d[n - 1][m - 1]; //输出右下角点距起点的距离即可
}
int main()
{
cin >> n >> m;
for(int i = 0; i < n; i ++ )
for(int j = 0; j < m; j ++ )
cin >> g[i][j];
cout << bfs() << endl;
return 0;
}
C++ STL queue
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int N = 110;
typedef pair<int, int> PII;
int n, m;
int g[N][N], d[N][N];
int bfs()
{
queue< pair<int, int> > q;
q.push({
0, 0});
memset(d, -1, sizeof(d));
d[0][0] = 0;
int dx[4] = {
-1, 0, 1, 0}, dy[4] = {
0, 1, 0, -1};
while (q.size())//队列不为空
{
PII t = q.front();//取队头元素
q.pop();//出队
for (int i = 0; i < 4; i++)
{
int x = t.first + dx[i], y = t.second + dy[i];
if (x >= 0 && x < n && y >= 0 && y < m && g[x][y] == 0 && d[x][y] == -1)
{
d[x][y] = d[t.first][t.second] + 1;//当前点到起点的距离
q.push({
x, y});//将新坐标入队
}
}
}
return d[n - 1][m -1];
}
int main()
{
cin >> n >> m;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
cin >> g[i][j];
cout << bfs() << endl;
return 0;
}
打印路径
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 110;
typedef pair<int, int> PII;
PII q[N*N],Prev[N][N];
int g[N][N], d[N][N];
int n, m;
int bfs()
{
int hh = 0, tt = 0;
q[0] = {
0, 0};
memset(d, -1, sizeof d);
int dx[4] = {
-1, 0, 1, 0}, dy[4] = {
0, 1, 0, -1};
d[0][0] = 0;
while(hh <= tt)
{
PII t = q[hh ++ ];
for(int i = 0; i < 4; i ++ )
{
int x = dx[i] + t.first, y = t.second + dy[i];
if(x >= 0 && x < n && y >= 0 && y < m && g[x][y] == 0 && d[x][y] == -1)
{
d[x][y] = d[t.first][t.second] + 1;
Prev[x][y] = t;
q[++ tt] = {
x, y};
}
}
}
int x = n - 1, y = m - 1;
while(x || y)//有一个不d等于0
{
cout << x << ' ' << y << endl;
PII t = Prev[x][y];
x = t.first, y = t.second;
}
return d[n - 1][m - 1];
}
int main()
{
cin >> n >> m;
for(int i = 0; i < n; i ++ )
for(int j = 0; j < m;j ++)
cin >> g[i][j];
cout << bfs() << endl;
return 0;
}
边栏推荐
- 【开源框架】国内首个通用云计算框架,任意程序都可做成云计算。
- UVa 437 - The Tower of Babylon (White Book)
- Flutter 桌面探索 | 自定义可拖拽导航栏
- [b01lers2020]Life on Mars
- .NET6之MiniAPI(十四):跨域CORS(上)
- [MySQL Advanced] Creation and Management of Databases and Tables
- utlis thread pool
- 113. Teach a Man how to fish - How to query the documentation and technical implementation details of any SAP UI5 control property by yourself
- 九种方式,教你读取 resources 目录下的文件路径
- start with connect by 实现递归查询
猜你喜欢

Conditional Statements for Shell Programming

Embedded Systems: GPIO

Boss: There are too many systems in the company, can you realize account interoperability?

2019年10月SQL注入的两倍

HCIP BGP实验报告

Shell编程的条件语句

Embedded systems: overview

云平台建设解决方案

pikachu Over permission 越权

Gains double award | know micro easily won the "2021 China digital twin solution suppliers in excellence" "made in China's smart excellent recommended products" double award!
随机推荐
Canvas App中点击图标生成PDF并保存到Dataverse中
21天打卡挑战学习MySQL——《MySQL工具的使用》第一周 第二篇
What is the difference between the generator version and the viewer version?
Data_web(九)mongodb增量同步到mongodb
RPA助力商超订单自动化!
Golang Chapter 2: Program Structure
如何创建一个Web项目
21天打卡挑战学习MySQL—Day第一周 第一篇
PowerMockup 4.3.4::::Crack
Causes of Mysql Disk Holes and Several Ways to Rebuild Tables
VLAN实验
start with connect by implements recursive query
电商秒杀系统
noip初赛
Flink--Join以及Flink函数
Codeup刷题笔记-简单模拟
如何设计 DAO 的 PoW 评判标准 并平衡不可能三角
2019年10月SQL注入的两倍
Data_web(八)mysql增量同步到mongodb
Research status of target detection at home and abroad