C语言找到一条从起点到终点的迷宫路径,并将路径输出。如果从起点到终点没有路径,则输出NO PASS! 注:所有迷宫的起点为左上角,终点为右下角。 【输入形式】依次输入n行由0和1构成的字符串,每行字符串长度相同,输入空串结束,其中1表示围墙,0表示可行路径。 【输出形式】如果起点到终点有路,则依次输出由L、R、D、U组成的路径字符串;否则输出NO PASS!。
时间: 2024-02-11 18:05:51 浏览: 133
用C++实现的迷宫问题,可以找出是否存在正确的迷宫通路
好的,这是一个经典的迷宫求解问题,可以使用深度优先搜索(DFS)或广度优先搜索(BFS)来解决。这里我给出一种DFS的解法:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX_N 100
int maze[MAX_N][MAX_N];
int n;
bool dfs(int x, int y, char *path)
{
// 到达终点,输出路径
if (x == n-1 && y == n-1) {
printf("%s\n", path);
return true;
}
// 标记为已访问
maze[x][y] = 1;
// 向四个方向搜索
if (x+1<n && maze[x+1][y]==0 && dfs(x+1, y, strcat(path, "D")))
return true;
if (y+1<n && maze[x][y+1]==0 && dfs(x, y+1, strcat(path, "R")))
return true;
if (x-1>=0 && maze[x-1][y]==0 && dfs(x-1, y, strcat(path, "U")))
return true;
if (y-1>=0 && maze[x][y-1]==0 && dfs(x, y-1, strcat(path, "L")))
return true;
// 如果四个方向都无法到达终点,则回溯
maze[x][y] = 0;
path[strlen(path)-1] = '\0'; // 取消最后一个字符
return false;
}
int main()
{
// 读入迷宫
char line[MAX_N];
while (fgets(line, MAX_N, stdin) != NULL) {
if (line[0] == '\n') break;
for (int j = 0; line[j] != '\0'; j++) {
maze[n][j] = line[j] - '0';
}
n++;
}
// 从起点开始搜索
char path[MAX_N*MAX_N];
path[0] = '\0'; // 空路径
if (!dfs(0, 0, path)) {
printf("NO PASS!\n");
}
return 0;
}
```
这里使用了一个辅助函数`dfs`,它接受当前位置`(x,y)`和已经走过的路径`path`作为参数。如果当前位置是终点,则输出路径并返回True;否则,向四个方向搜索,如果某个方向可以到达终点,则返回True;如果四个方向都无法到达终点,则回溯并返回False。在搜索之前,需要将起点标记为已访问。注意,这里使用了字符串拼接函数`strcat`来更新路径字符串,同时还要在回溯时取消最后一个字符。
阅读全文