迷宫求解是一个经典的程序设计问题。用一个m行*n列的方格图表示迷宫,寻找通过迷宫的一条路径,即从入口出发,沿某一方向向前探索,若能走通,则继续向前走;否则沿原路退回,换一个方向继续探索,直到探索出一条通路为止。
迷宫问题通常描述为:给定一个二维矩阵表示的迷宫,其中 0
表示可以通过的路径,1
表示墙壁。我们需要找到一条从入口到出口的路径,并输出路径上的坐标。
代码如下
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构,用于存储迷宫路径中的坐标
typedef struct SNode
{
int x, y; // 存储坐标 (x, y)
struct SNode *next; // 指向下一个节点的指针
} SNode;
// 定义链式栈结构
typedef struct
{
SNode *top; // 栈顶指针
SNode *head; // 栈底指针(始终指向栈底)
} LinkStack;
// 初始化链式栈
void InitStack(LinkStack *S)
{
S->top = S->head = NULL; // 初始化栈顶和栈底指针为空
}
// 向链式栈中压入一个元素
void Push(LinkStack *S, int i, int j)
{
SNode *r; // 定义一个新节点指针
r = (SNode *)malloc(sizeof(SNode)); // 动态分配内存
r->x = i; // 设置节点的x坐标
r->y = j; // 设置节点的y坐标
r->next = NULL; // 新节点的next指针置为空
if (S->top == NULL) // 如果栈为空
S->head = S->top = r; // 新节点同时成为栈底和栈顶
else
{
r->next = S->top; // 新节点的next指针指向当前栈顶
S->top = r; // 更新栈顶指针为新节点
}
}
// 从链式栈中弹出一个元素
void Pop(LinkStack *S, int *i, int *j)
{
SNode *p; // 定义一个临时节点指针
p = S->top; // 指向当前栈顶节点
*i = p->x; // 获取栈顶节点的x坐标
*j = p->y; // 获取栈顶节点的y坐标
S->top = p->next; // 更新栈顶指针为下一个节点
free(p); // 释放当前栈顶节点的内存
}
// 寻找迷宫路径的函数
void Path(int M[][10], int x1, int y1, int x2, int y2)
{
int x, y, i, k = 0; // 定义变量,用于存储当前坐标和路径长度
int px[50], py[50]; // 用于存储路径坐标的数组
LinkStack SP;