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"。