当前位置:网站首页>Walk the Maze BFS
Walk the Maze BFS
2022-08-03 22:47:00 【Little moxa cuisine dishes】
题目描述
给定一个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
解题思路:
没有什么特别的技巧,Using breadth-first search traversal violence can be.
The specific way how to search,Please look at this picture below:

具体的代码实现
I used to queue here,Which I would, in the form of handwritten implementation queue,与直接使用C++ STL的queue To write the code to solve this problem
数组模拟队列实现:
#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 The direction of the vector consisting of、右、下、左
//If didn't quite understand the above control direction with little skill,Can on scratch paper to[0,0]为例,以(x,y) = (-1,0) One-to-one to implement the following the up and down or so,Is very clear
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;
}
边栏推荐
- Basic Concepts of Graphs
- Embedded systems: overview
- 物联网新零售模式,引领购物新潮流
- websocket多线程发送消息报错TEXT_PARTIAL_WRITING--自旋锁替换synchronized独占锁的使用案例
- 一个函数有多少种调用方式?
- Recognized by International Authorities | Yunzhuang Technology was selected in "RPA Global Market Pattern Report, Q3 2022"
- 2022/8/3 考试总结
- LabVIEW代码生成错误 61056
- Testng监听器
- What is the difference between the generator version and the viewer version?
猜你喜欢

HCIP BGP lab report

noip初赛

complete binary tree problem

Bytebase数据库 Schema 变更管理工具

Live Preview | Build Business Intelligence, Quickly Embrace Financial Digital Transformation
![navicat 连接 mongodb 报错[13][Unauthorized] command listDatabases requires authentication](/img/09/a579c60e07cdc145175e72673409f7.png)
navicat 连接 mongodb 报错[13][Unauthorized] command listDatabases requires authentication

The salary of soft testers at each stage, come to Kangkang, how much can you get?

关于IDO预售系统开发技术讲解丨浅谈IDO预售合约系统开发原理分析

PowerMockup 4.3.4::::Crack

win10系统下yolov5-V6.1版本的tensorrt部署细节教程及bug修改
随机推荐
.NET6之MiniAPI(十四):跨域CORS(上)
易观分析:2022年Q2中国网络零售B2C市场交易规模达23444.7亿元
pikachu Over permission
【MySQL进阶】数据库与表的创建和管理
LabVIEW代码生成错误 61056
Bytebase database schema change management tool
start with connect by 实现递归查询
如何创建一个Web项目
目标检测技术研究现状及发展趋势
Causes of Mysql Disk Holes and Several Ways to Rebuild Tables
Lift, Splat, Shoot: Encoding Images from Arbitrary Camera Rigs by Implicitly Unprojecting to 3D 论文笔记
UVa 437 - The Tower of Babylon(白书)
Boss: There are too many systems in the company, can you realize account interoperability?
投资性大于游戏性 NFT游戏到底是不是门好生意
Golang Chapter 2: Program Structure
Fluorescein-PEG-CLS,胆固醇-聚乙二醇-荧光素科研试剂
"Digital Economy Panorama White Paper" Financial Digital User Chapter released!
Storage engine written by golang, based on b+ tree, mmap
藏宝计划TreasureProject(TPC)系统模式开发技术原理
完全二叉树问题