写一个C语言代码问题描述】下图给出了一个迷宫的平面图,其中标记为黑色的为障碍,标记为白色的为可以通行的区域。迷宫的入口为左上角的黄色方格,出口为右下角的黄色方格。在迷宫中,只能从一个方格走到相邻的上、下、左、右四个方向之一。 image.png 找到一条从起点到终点的迷宫路径,并将路径输出。如果从起点到终点没有路径,则输出NO PASS! 注:所有迷宫的起点为左上角,终点为右下角。 【输入形式】依次输入n行由0和1构成的字符串,每行字符串长度相同,输入空串结束,其中1表示围墙,0表示可行路径。 【输出形式】如果起点到终点有路,则依次输出由L、R、D、U组成的路径字符串;否则输出NO PASS!。 【样例输入】 0111111 0011101 1001101 0011001 1000111 1110000 【样例输出】 DRDDDRRDRRR 【样例说明】 【评分标准】
时间: 2024-02-25 21:58:22 浏览: 99
这是一个经典的迷宫求解问题,可以使用深度优先搜索(DFS)或广度优先搜索(BFS)来求解。以下是一种基于DFS的C语言代码实现:
```c
#include <stdio.h>
#include <string.h>
#define MAX_N 100
int n, m; // 迷宫的行数和列数
int maze[MAX_N][MAX_N]; // 迷宫地图
int visited[MAX_N][MAX_N]; // 标记某个位置是否已经被访问过
int dx[4] = {0, 1, 0, -1}; // 方向数组,用于计算下一步的位置
int dy[4] = {1, 0, -1, 0};
void dfs(int x, int y, char *path) {
if (x == n-1 && y == m-1) { // 当前位置是终点,输出路径并返回
printf("%s\n", path);
return;
}
visited[x][y] = 1; // 标记当前位置已经被访问过
for (int i = 0; i < 4; i++) { // 枚举四个方向
int nx = x + dx[i], ny = y + dy[i]; // 计算下一步的位置
if (nx >= 0 && nx < n && ny >= 0 && ny < m && maze[nx][ny] == 0 && visited[nx][ny] == 0) { // 如果下一步位置合法且可以走
path[strlen(path)] = i == 0 ? 'R' : i == 1 ? 'D' : i == 2 ? 'L' : 'U'; // 将当前方向加入路径
dfs(nx, ny, path); // 继续递归搜索下一步
path[strlen(path)-1] = '\0'; // 回溯,将当前方向从路径中删除
}
}
visited[x][y] = 0; // 恢复当前位置的状态
}
int main() {
// 读入迷宫地图
char str[MAX_N+1];
while (scanf("%s", str) == 1) {
for (int i = 0; i < strlen(str); i++) {
maze[n][i] = str[i] - '0';
}
n++;
m = strlen(str);
}
// 从起点开始搜索
char path[MAX_N*MAX_N+1] = "";
dfs(0, 0, path);
if (strlen(path) == 0) { // 如果没有找到路径,则输出 NO PASS!
printf("NO PASS!\n");
}
return 0;
}
```
代码的基本思路是使用DFS递归搜索迷宫,对于每一个位置,枚举四个方向(右、下、左、上),如果下一步位置合法(不超出边界、不是障碍物、没有被访问过),则将当前方向加入路径,继续递归搜索下一步,最后回溯时将当前方向从路径中删除。如果搜索到终点,则输出路径,否则输出 NO PASS!
阅读全文