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

18714 迷宫问题

### 思路
1. 使用深度优先搜索(DFS)来遍历迷宫。
2. 从入口(1,1)开始,尝试向四个方向(上、下、左、右)移动。
3. 如果移动到的位置是出口(n,m),则输出 "yes"。
4. 如果移动到的位置是可以通行的(值为0),则继续递归搜索。
5. 使用一个二维数组记录已经访问过的位置,避免重复访问。
6. 如果所有路径都尝试过,仍未到达出口,则输出 "no"。

### 伪代码
1. 定义一个二维数组 `visited` 用于记录访问状态。
2. 定义一个函数 `dfs(x, y)`,表示从位置 `(x, y)` 开始搜索:
   - 如果 `(x, y)` 是出口,返回 true。
   - 如果 `(x, y)` 超出边界或不可通行或已访问,返回 false。
   - 标记 `(x, y)` 为已访问。
   - 递归搜索四个方向(上、下、左、右)。
   - 如果任意方向可以到达出口,返回 true。
   - 否则,返回 false。
3. 在主函数中调用 `dfs(0, 0)`,根据返回值输出 "yes" 或 "no"。

### C++代码
```cpp

#include <iostream>
#include <vector>using namespace std;int n, m;
vector<vector<int>> maze;
vector<vector<bool>> visited;bool dfs(int x, int y) {if (x == n - 1 && y == m - 1) {return true;}if (x < 0 || x >= n || y < 0 || y >= m || maze[x][y] == 1 || visited[x][y]) {return false;}visited[x][y] = true;if (dfs(x + 1, y) || dfs(x - 1, y) || dfs(x, y + 1) || dfs(x, y - 1)) {return true;}return false;
}int main() {cin >> n >> m;maze.resize(n, vector<int>(m));visited.resize(n, vector<bool>(m, false));for (int i = 0; i < n; ++i) {for (int j = 0; j < m; ++j) {char ch;cin >> ch;maze[i][j] = ch - '0';}}if (dfs(0, 0)) {cout << "yes" << endl;} else {cout << "no" << endl;}return 0;
}


```

### 总结
- 使用深度优先搜索(DFS)来遍历迷宫。
- 从入口开始,尝试向四个方向移动,递归搜索。
- 使用一个二维数组记录访问状态,避免重复访问。
- 如果找到出口,输出 "yes",否则输出 "no"。


http://www.mrgr.cn/news/51202.html

相关文章:

  • 机器学习数据标准化与归一化:提升模型精度的关键
  • Redis知识应用索引指南
  • 【大模型理论篇】大模型中的强化学习RLHF(PPO)、DPO(Direct Preference Optimization)等概念的理解与解析
  • 在低代码时代无代码该如何应对与利用?
  • 基于STM32的出租车计价器设计
  • Spring Boot框架的大创项目文档管理系统
  • 电子秤的校零校准原理
  • 行内元素和块级元素的区别?
  • Unity性能优化
  • STM32的独立看门狗定时器(IWDG)技术介绍
  • PatchMixer论文解析
  • DeepSpeech理论与实战
  • 学习记录:js算法(六十六):数组中的第K个最大元素
  • 使用Windbg分析dump文件去排查C++软件异常的一般步骤与要点分享
  • Android 自定义Toast显示View
  • WRF ungrib.exe 出错 ERROR: Data not found 的原因分析
  • “长三角档案数字资源长期保存与数据安全治理”专题培训内容抢先看
  • 正态分布拟合时,柱状图数据是怎么计算的
  • 数据治理基础
  • 防范数据泄露,守护安全存储新时代