第一行输入两个整数 � n 和 � m,表示这是一个 � × � n×m 的迷宫。 接下来的输入一个 � n 行 � m 列的迷宫。其中 'S' 表示蒜头君的位置,'*'表示墙,蒜头君无法通过,'.'表示路,蒜头君可以通过'.'移动,'T'表示迷宫的出口(蒜头君每次只能移动到四个与他相邻的位置——上,下,左,右)。 输出格式 输出一个字符串,如果蒜头君可以逃出迷宫输出"yes",否则输出"no"。用C++完成这个程序
时间: 2023-06-10 07:04:23 浏览: 198
用C++实现的迷宫问题,可以找出是否存在正确的迷宫通路
很高兴为您解答问题。以下是我的代码建议:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_N 100
#define MAX_M 100
int n, m;
char maze[MAX_N][MAX_M];
int visited[MAX_N][MAX_M]; // 标记每个格子是否被访问过
// 从(x, y)位置开始搜索是否能逃出迷宫
int dfs(int x, int y) {
if (x < 0 || x >= n || y < 0 || y >= m || maze[x][y] == '*' || visited[x][y]) {
// 越界、撞墙或已经访问过
return 0;
}
if (maze[x][y] == 'T') {
// 找到了出口
return 1;
}
visited[x][y] = 1; // 标记为已访问
// 分别从上下左右四个方向继续搜索
int res = dfs(x-1, y) || dfs(x+1, y) || dfs(x, y-1) || dfs(x, y+1);
visited[x][y] = 0; // 恢复为未访问,以便从别的路径搜索到这个格子时也能访问
return res;
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++) {
scanf("%s", maze[i]);
}
// 找出蒜头君的位置并开始搜索
int found = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (maze[i][j] == 'S') {
found = dfs(i, j);
break;
}
}
if (found) {
break;
}
}
if (found) {
printf("yes\n");
} else {
printf("no\n");
}
return 0;
}
```
由于这是一个深度优先搜索的问题,所以我们可以写一个递归函数 `dfs`,从当前格子开始依次搜索上、下、左、右四个方向是否能逃出迷宫。需要注意的是,我们需要用一个二维数组 `visited` 来记录每个格子是否被访问过,以防止重复访问和死循环。
在主程序中,我们先读入迷宫,并找出蒜头君的位置。然后从蒜头君的位置开始调用 `dfs`,看是否能找到出口。如果能找到,输出 "yes";否则输出 "no"。
希望我的回答能够帮助到您!
阅读全文