注意!!!在打印那个函数的最后少了一个‘}’符号!!内有我对这个算法的详细思考笔记。。此程序包括头文件和主文件。。全部在VC6.0下调试通过。。注意这个是C语言版本。
值得初学数据结构的人学习使用,可以大幅提高C语言的指针和结构的理解!!特别是C语言中指向结构体的指针作为函数参数那一节的理解!谭浩强C语言P292!
/**
求迷宫中从入口到出口的所有路径是一个经典的程序设计问题!
1.为了保证在任何位置上都能沿原路返回,显然需要用一个后进先出的结构来保存从入口到当前位置的路径!SqStack堆栈可以描述。
2.从入口到出口,要选择一个初始方向,每个通道快包含一个位置属性和一个方向属性,此方向属性代表下一个通道块在当前通道块上的方向。如果需要统计入口到出口的步数,在通道块结构里可以加一个步数属性!SElemType和PosType结构可以描述。
3.如何描述迷宫??迷宫中通道快用字符'1'表示,墙面用字符'#'表示。如此一来,其实本质上,迷宫就是一个二维字符数组。可以用MazeType结构描述!
4.main函数包含3个内容,首先生成一个迷宫(InitMaze),然后打印此迷宫(PrintMaze),再就是迷宫求解的核心算法(MazePath),最后打印求解之后的迷宫。
5.核心算法的中心思想,严蔚敏的数据结构书上第50页51页52页有详细描述。
6.以下程序包括头文件和主文件。。全部在VC6.0下调试通过。。注意这个是C语言版本。
by sunrubben
2010.9.28
**/
/头文件
///
#include
#include
#include
#define TRUE 1
#define FALSE 0
#define OVERFLOW 0
#define OK 1
#define ERROR 0
#define STACK_INIT_SIZE 300//存储空间初始化分配量
#define STACK_INCREMENT 10//存储空间分配增量
#define MAXLEN 10
typedef int Status;
typedef struct
{
int r;
int c;
}PosType;
typedef struct
{
int ord;
PosType seat;
int di;
}SElemType;
typedef struct
{ SElemType *base;
SElemType *top;//栈底指针
int stacksize;
}SqStack;//函数声明
typedef struct
{
int r;
int c;
char adr[MAXLEN][MAXLEN];
}MazeType;//迷宫类型
Status InitStack(SqStack *S);//初始化
Status Push(SqStack *S,SElemType e);//向栈底插入元素
Status Pop(SqStack *S);//出栈
Status StackEmpty(SqStack *S);
Status InitMaze(MazeType *maze);//初始化迷宫
Status Pass(MazeType *maze,PosType curpos);//判断当前位置可否通过
Status FootPrint(MazeType *maze,PosType curpos);//走过的地方留下足迹
PosType NextPos(PosType curpos,int i);//探索下一位置并返回下一位置的坐标
Status MarkPrint(MazeType *maze,PosType curpos);//曾走过但不通留下标记并返回OK
Status MazePath(MazeType *maze,PosType start,PosType end);//迷宫maze存在从入口start到end的通道则求得一条存放在栈中
v
oid PrintMaze(MazeType *maze);//输出迷宫
///
///主文件///