c语言用深度优先算法,输入一个有多条通路的迷宫(左上角为入口,右下角为出口)0为通路,1为墙,输出所有路径U表示上,R表示右,D表示下,L表示左
时间: 2023-09-02 07:12:44 浏览: 135
好的,我将为您解答这个问题。
首先,您需要使用深度优先算法来遍历这个迷宫。具体来说,你需要从起点开始,尝试向上、右、下、左四个方向走,如果发现某个方向可以通行而且没有被走过,就继续朝那个方向走下去。如果某个方向走不通或者已经走过了,就返回上一步,换一个方向继续走。
在遍历的过程中,你需要记录下每个节点的父节点,以便最后输出路径。
当你到达终点时,你可以从终点开始,依次向父节点回溯,直到回到起点,并输出路径。
下面是C语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#define ROW 5
#define COL 5
int maze[ROW][COL] = {
{0, 1, 0, 1, 0},
{0, 0, 0, 0, 0},
{1, 0, 1, 0, 1},
{0, 0, 1, 0, 0},
{1, 0, 0, 1, 0}
};
int visited[ROW][COL] = {0}; // 标记是否已经走过
int parent[ROW][COL][2] = {0}; // 记录每个节点的父节点
// 递归遍历迷宫
void dfs(int x, int y, int px, int py) {
if (x < 0 || x >= ROW || y < 0 || y >= COL || maze[x][y] == 1 || visited[x][y]) {
return;
}
visited[x][y] = 1;
parent[x][y][0] = px;
parent[x][y][1] = py;
if (x == ROW - 1 && y == COL - 1) { // 到达终点
int path[ROW * COL][2];
int len = 0;
int cx = x, cy = y;
while (cx != 0 || cy != 0) { // 从终点回溯到起点
path[len][0] = cx;
path[len][1] = cy;
len++;
int tx = parent[cx][cy][0];
int ty = parent[cx][cy][1];
cx = tx;
cy = ty;
}
printf("Path: ");
for (int i = len - 1; i >= 0; i--) { // 输出路径
int dx = path[i][0] - path[i+1][0];
int dy = path[i][1] - path[i+1][1];
if (dx == -1) {
printf("D");
} else if (dx == 1) {
printf("U");
} else if (dy == -1) {
printf("R");
} else if (dy == 1) {
printf("L");
}
}
printf("\n");
return;
}
dfs(x+1, y, x, y); // 向下走
dfs(x, y+1, x, y); // 向右走
dfs(x-1, y, x, y); // 向上走
dfs(x, y-1, x, y); // 向左走
}
int main() {
dfs(0, 0, -1, -1); // 从起点开始遍历
return 0;
}
```
这里简单地使用了一个5x5的迷宫来演示,你可以根据实际情况进行修改。运行代码,你将会看到输出的所有路径。
阅读全文