迷宫求解(c语言 图的应用 数据结构)
时间: 2023-07-27 07:11:20 浏览: 133
迷宫求解可以使用图论中的深度优先搜索(DFS)或广度优先搜索(BFS)来实现。下面是一个使用邻接矩阵表示图的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
int maze[MAXSIZE][MAXSIZE]; // 迷宫图
int visited[MAXSIZE]; // 记录节点是否被访问过
int path[MAXSIZE]; // 记录路径
int pathlen; // 记录路径长度
int n; // 节点个数
int start, end; // 起点和终点
void DFS(int v) {
visited[v] = 1;
path[pathlen++] = v;
if (v == end) { // 到达终点
for (int i = 0; i < pathlen; i++) {
printf("%d ", path[i]);
}
printf("\n");
} else {
for (int i = 0; i < n; i++) {
if (maze[v][i] && !visited[i]) { // v和i之间有路径,且i未被访问过
DFS(i);
}
}
}
visited[v] = 0; // 回溯
pathlen--;
}
int main() {
scanf("%d %d %d", &n, &start, &end);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &maze[i][j]);
}
}
DFS(start);
return 0;
}
```
这里使用邻接矩阵来表示图,其中`maze[i][j]`表示节点i和节点j之间是否有路径。`visited`数组用于记录节点是否被访问过,`path`数组用于记录路径,`pathlen`记录路径长度。在DFS函数中,首先将当前节点标记为已访问,并将其添加到路径中。如果当前节点是终点,则输出路径。否则,遍历当前节点的所有邻居节点,如果邻居节点未被访问过,则递归访问该节点。最后回溯,将当前节点标记为未访问过,并从路径中删除。
需要注意的是,以上代码只能求出一条路径。如果需要求出所有路径,可以在找到一条路径后,将终点标记为已访问过,并从路径中删除终点,然后继续搜索,直到找到所有路径为止。
阅读全文