当前位置: 首页 > news >正文

题解:AcWing 844 走迷宫

【题目来源】

AcWing:844. 走迷宫 - AcWing题库

【题目描述】

给定一个 \(n\times m\) 的二维整数数组,用来表示一个迷宫,数组中只包含 \(0\)\(1\),其中 \(0\) 表示可以走的路,\(1\) 表示不可通过的墙壁。

最初,有一个人位于左上角 \((1,1)\) 处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。

请问,该人从左上角移动至右下角 \((n,m)\) 处,至少需要移动多少次。

数据保证 \((1,1)\) 处和 \((n,m)\) 处的数字为 \(0\),且一定至少存在一条通路。

【输入】

第一行包含两个整数 \(n\)\(m\)

接下来 \(n\) 行,每行包含 \(m\) 个整数(\(0\)\(1\)),表示完整的二维数组迷宫。

【输出】

输出一个整数,表示从左上角移动至右下角的最少移动次数。

【输入样例】

5 5
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0

【输出样例】

8

【解题思路】

image

【代码详解】

《AcWing 844 走迷宫》 #BFS#

// 使用STL队列
#include <bits/stdc++.h>
using namespace std;const int N = 110;  // 定义地图最大尺寸// 定义节点结构体,存储位置和步数
struct Node 
{int x;     // 当前节点的x坐标int y;     // 当前节点的y坐标int step;  // 从起点到当前节点的步数
};int n, m;        // 地图的行数和列数
int g[N][N];     // 存储地图信息(0表示可通行,1表示障碍)
bool vis[N][N];  // 标记数组,记录节点是否被访问过
int dx[4] = {-1, 0, 1, 0};  // 四个方向的x偏移量(上、右、下、左)
int dy[4] = {0, 1, 0, -1};   // 四个方向的y偏移量(上、右、下、左)
queue<Node> q;   // BFS使用的队列// 检查坐标(x,y)是否合法且可通行
bool check(int x, int y)
{// 检查是否越界if (x < 1 || x > n || y < 1 || y > m) return false;// 检查是否是障碍物if (g[x][y] == 1) return false;// 检查是否已被访问if (vis[x][y]) return false;return true;
}// BFS算法实现,返回从起点到终点的最短步数
int bfs(int x, int y, int step)
{// 标记起点为已访问vis[x][y] = true;// 将起点加入队列q.push(Node{x, y, step});// 当队列不为空时循环while (!q.empty()) {// 取出队首节点Node nownode = q.front(); q.pop();// 如果到达终点,返回当前步数if (nownode.x == n && nownode.y == m) {return nownode.step;}// 遍历四个方向for (int i = 0; i < 4; i++) {int nx = nownode.x + dx[i];  // 计算新位置的x坐标int ny = nownode.y + dy[i];  // 计算新位置的y坐标// 如果新位置合法且未被访问if (check(nx, ny)) {vis[nx][ny] = true;  // 标记为已访问// 将新节点加入队列,步数+1q.push(Node{nx, ny, nownode.step + 1});}}}// 如果无法到达终点,返回-1return -1;
}int main()
{// 输入地图尺寸cin >> n >> m;// 输入地图数据for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++)cin >> g[i][j];// 调用BFS并输出结果cout << bfs(1, 1, 0) << endl;return 0;
}
// 数组模拟队列(优先推荐)
#include <bits/stdc++.h>
using namespace std;const int N = 110;          // 定义地图最大尺寸
typedef pair<int, int> PII; // 定义坐标对类型int n, m;                   // 地图的行数和列数
int g[N][N];                // 存储地图信息(0表示可通行,1表示障碍)
int d[N][N];                // 存储每个位置到起点的最短距离
PII q[N * N];               // 数组模拟的队列,存储待处理的坐标// BFS算法实现,返回从起点到终点的最短步数
int bfs()
{int hh = 0, tt = 0;     // 队列头指针和尾指针q[0] = {0, 0};          // 将起点(0,0)加入队列memset(d, -1, sizeof(d)); // 初始化距离数组为-1(表示未访问)d[0][0] = 0;            // 起点到自己的距离为0// 定义四个方向的偏移量(上、右、下、左)int dx[4] = {-1, 0, 1, 0};int dy[4] = {0, 1, 0, -1};// 当队列不为空时循环while (hh <= tt){auto t = q[hh++];   // 取出队首元素// 遍历四个方向for (int i = 0; i < 4; i++){int x = t.first + dx[i];  // 计算新位置的x坐标int y = t.second + dy[i]; // 计算新位置的y坐标// 检查新位置是否合法且未被访问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];// 调用BFS并输出结果cout << bfs() << endl;return 0;
}

【运行结果】

5 5
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
8
http://www.jsqmd.com/news/399312/

相关文章:

  • 京东e卡回收,盘活闲置好路子 - 京顺回收
  • JumpServer堡垒机部署与实战:从0到1搭建统一运维入口
  • 独生子女的“父母改善”:一个正在爆发的购房新命题
  • 题解:AcWing 843 n-皇后问题
  • 研究生阶段“大论文”与“小论文”分别是什么意思?
  • 《信号与系统》欧拉公式的本质的角度的旋转
  • 题解:AcWing 842 排列数字
  • CVE-2020-1957
  • 题解:AcWing 841 字符串哈希
  • 题解:AcWing 839 模拟堆
  • 题解:AcWing 838 堆排序
  • 题解:AcWing 840 模拟散列表
  • 神来之笔!提示工程架构师的Agentic AI可视化分析创新之举
  • 探索Gemini在AI原生应用中的无限可能
  • 硕士研究生毕业要求的两个工作量是什么意思?
  • 《AI应用架构师剖析:AI发展进程中社会责任的关系密码》
  • Windows 的 cmd 里如何定义 alias?
  • 题解:AcWing 837 连通块中点的数量
  • 题解:AcWing 836 合并集合
  • 题解:AcWing 240 食物链
  • 2026 深度解析:ChatGPT Plus 国内充值与代充避坑指南(技术原理与实操全纪录)
  • 2026 技术指南:攻克 ChatGPT Plus 国内订阅难题(含代充、虚拟卡、支付风控深度解析)
  • 【UI自动化测试】2_PO模式 _单元测试框架(重点)
  • 多源异构大数据融合挖掘技术
  • 模型蒸馏在AI原生应用中的5大核心优势解析
  • 【UI自动化测试】1_PO模式 _面向过程编码
  • 开发日志4
  • 讲讲积分墙广告、精品页面、canvas 的 SEO 密码
  • Copilot进阶教程:在AI原生应用中实现智能开发工作流
  • 题解:AcWing 835 Trie字符串统计