下图给出了一个迷宫的平面图,其中标记为黑色的为障碍,标记为白色的为可以通行的区域。迷宫的入口为左上角的黄色方格,出口为右下角的黄色方格。在迷宫中,只能从一个方格走到相邻的上、下、左、右四个方向之一。 image.png 找到一条从起点到终点的迷宫路径,并将路径输出。如果从起点到终点没有路径,则输出NO PASS! 注:所有迷宫的起点为左上角,终点为右下角。 【输入形式】依次输入n行由0和1构成的字符串,每行字符串长度相同,输入空串结束,其中1表示围墙,0表示可行路径。 【输出形式】如果起点到终点有路,则依次输出由L、R、D、U组成的路径字符串;否则输出NO PASS!。 【样例输入】 0111111 0011101 1001101 0011001 1000111 1110000 【样例输出】 DRDDDRRDRRR
时间: 2024-02-09 17:12:42 浏览: 126
以下是C语言的代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXN 100
int maze[MAXN][MAXN]; // 迷宫
int vis[MAXN][MAXN]; // 标记数组,标记某个位置是否已经访问过
int pre[MAXN][MAXN]; // 记录每个位置是从哪个位置走过来的
char path[MAXN * MAXN]; // 记录路径
int n, m; // 迷宫的行数和列数
// 方向数组
int dir[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; // 分别表示向右、向左、向下、向上
// 判断某个位置是否可行
int is_valid(int x, int y) {
return x >= 0 && x < n && y >= 0 && y < m && maze[x][y] == 0 && !vis[x][y];
}
// 深度优先搜索
int dfs(int x, int y) {
vis[x][y] = 1; // 标记该位置已经访问过
if (x == n - 1 && y == m - 1) { // 如果已经到达终点,返回1
return 1;
}
for (int i = 0; i < 4; i++) { // 枚举四个方向
int nx = x + dir[i][0], ny = y + dir[i][1];
if (is_valid(nx, ny)) { // 如果该位置可行,继续搜索
pre[nx][ny] = x * m + y; // 记录该位置是从哪个位置走过来的
if (dfs(nx, ny)) { // 如果搜索成功,返回1
return 1;
}
}
}
return 0; // 如果四个方向都无法到达终点,返回0
}
int main() {
// 读入迷宫
char line[MAXN];
while (fgets(line, MAXN, stdin) != NULL && line[0] != '\n') {
for (int i = 0; i < strlen(line) - 1; i++) {
maze[n][i] = line[i] - '0';
}
m = strlen(line) - 1;
n++;
}
// 搜索迷宫
if (dfs(0, 0)) { // 如果搜索成功,逆推出路径
int x = n - 1, y = m - 1, cnt = 0;
while (x != 0 || y != 0) {
int px = pre[x][y] / m, py = pre[x][y] % m;
if (px == x + 1) { // 下
path[cnt++] = 'D';
} else if (px == x - 1) { // 上
path[cnt++] = 'U';
} else if (py == y + 1) { // 右
path[cnt++] = 'R';
} else { // 左
path[cnt++] = 'L';
}
x = px, y = py;
}
for (int i = cnt - 1; i >= 0; i--) { // 注意要逆序输出
printf("%c", path[i]);
}
printf("\n");
} else { // 如果搜索失败
printf("NO PASS!\n");
}
return 0;
}
```
该代码使用深度优先搜索(DFS)求解迷宫路径,先从起点开始搜索,每次向四个方向扩展,直到找到终点或者四个方向都无法到达终点为止。在搜索的过程中,使用pre数组记录每个位置是从哪个位置走过来的。搜索结束后,从终点开始逆推出路径,把路径存储在path数组中,最后逆序输出即可。
阅读全文