用c语言写一个代码:参考课本迷宫问题的求解,用栈求解迷宫问题的所有路径以及最短路径。
时间: 2023-11-21 11:10:01 浏览: 83
【数据结构】C语言用链栈解决迷宫问题,并用BFS找到最短路径
5星 · 资源好评率100%
好的,以下是C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef struct {
int x, y; // 迷宫中的坐标点
} Point;
typedef struct {
Point data[MAXSIZE]; // 栈中存储的数据
int top; // 栈顶指针
} Stack;
int maze[6][6] = {
{1, 1, 1, 1, 1, 1},
{1, 0, 0, 0, 0, 1},
{1, 0, 1, 0, 1, 1},
{1, 0, 0, 1, 0, 1},
{1, 0, 1, 0, 0, 1},
{1, 1, 1, 1, 1, 1}
}; // 迷宫地图
Stack path; // 存储路径的栈
int minSteps = 1000000; // 最短路径的步数
void InitStack(Stack *s) {
s->top = -1;
}
int IsEmpty(Stack *s) {
return s->top == -1;
}
int IsFull(Stack *s) {
return s->top == MAXSIZE - 1;
}
void Push(Stack *s, Point p) {
if (IsFull(s)) {
printf("Stack is full!\n");
exit(1);
}
s->data[++(s->top)] = p;
}
Point Pop(Stack *s) {
if (IsEmpty(s)) {
printf("Stack is empty!\n");
exit(1);
}
return s->data[(s->top)--];
}
void PrintPath(Stack *s) {
printf("Path: ");
for (int i = 0; i <= s->top; i++) {
printf("(%d,%d) ", s->data[i].x, s->data[i].y);
}
printf("\n");
}
void DFS(int x, int y, int steps) {
if (maze[x][y] == 2) { // 到达终点
if (steps < minSteps) { // 更新最短路径
minSteps = steps;
PrintPath(&path);
}
return;
}
if (maze[x][y] == 1) { // 碰到墙壁或已经走过的路
return;
}
maze[x][y] = 1; // 标记为已走过的路
Point p = {x, y};
Push(&path, p); // 将当前坐标点压入栈中
// 向四个方向搜索
DFS(x + 1, y, steps + 1);
DFS(x - 1, y, steps + 1);
DFS(x, y + 1, steps + 1);
DFS(x, y - 1, steps + 1);
Pop(&path); // 回溯
maze[x][y] = 0; // 标记为未走过的路
}
int main() {
InitStack(&path);
DFS(1, 1, 0);
printf("Minimum steps: %d\n", minSteps);
return 0;
}
```
代码实现了迷宫问题的解法,采用了深度优先搜索算法,通过栈来存储走过的路径。程序在搜索到终点时,会将当前路径与最短路径进行比较,更新最短路径,并输出所有路径。最后,程序输出最短路径的步数。
阅读全文