引言
这是一个简单的顺序栈的应用求解迷宫问题,主要分享的是在求解这个问题的之前的准备,
分析所需的数据,获得正确的数据结构,分析所需要的功能,划分模块,再分析各模块中,需要的具体功能,以确定功能函数。
这样也书写代码时,就可以事半功倍。
一,问题描述
迷宫求解问题
提出以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。迷宮问题要求,求出从入口(x,y)到出口(x,y)的一条通路,或得出没有通路的结论。
基本要求:首先实现一个以链表作存储结构的栈类型,然后编写一个求迷宫问题的非递归程序,求得的通路。
要求用栈实现迷宫问题的求解
将要构建的迷宫:向下为x正方向;向右为y正方向
二,分析所用数据结构
迷宫结构体用于存储构建的迷宫数据。
坐标结构体和栈元素结构体都是服务于栈结构体。
三、所需函数及其功能
这幅图可以很清晰的,了解都有哪些函数,这些函数的功能又是什么。
图中很多函数都是为了一个函数服务的,即求解迷宫的函数。
蓝色底的函数,实现了但是没有测试,大家可以自行测试
四、程序执行详细框图
这是整个迷宫问题项目的详细执行过程。大家可以先看看,到时候阅读代码也会更加清洗直观。
不同的颜色,是一个不同的模块,实现相应的功能
五、代码实现-详细注释
代码相应的地方都有注释,也体现了我思考的过程,如有错误或者更优解,欢迎在指正讨论。
1、maze.h
#ifndef __MAZE_H__
#define __MAZE_H__
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define TRUE 1
#define FALSE 0
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define COLUMN 10 //列
#define ROW 10 //行
typedef struct{
char** maze; //迷宫二维数组
int** footprint; //足迹二维数组
int row;
int column;
}MazeType;
typedef struct{
int x;
int y;
}PosType;
typedef struct{
int ord; //通道块在路径上的序号
PosType seat; //通道块在迷宫中的“坐标位置”
int di; //从此通道块走向下一个通道块的“方向”
}SElemType;
typedef struct{
SElemType* base;
SElemType* top;
int stacksize;
}SqStack;
//构造一个空栈
bool InitStack(SqStack* S);
//初始化迷宫数据
bool InitMaze(MazeType* M);
//判断是否为空栈
bool IsStackEmpty(SqStack S);
//入栈,元素e为新的栈顶元素,传入e形参拷贝值,返回改变的栈S,及是否入栈成功
bool Push(SqStack* S, SElemType e);
//出栈,指针传入地址,直接改变e变量,即返回改变的e和栈S,及是否出栈成功
bool Pop(SqStack* S, SElemType* e);
//输出迷宫
bool PrintfMaze(MazeType* M);
//输出迷宫的路径
bool PrintfFoot(MazeType* M, SqStack* S);
//将迷宫的当前位置Pos设置为“走过”,即footprint该位置为1
bool FootPrint(MazeType* M, PosType pos);
//判断当前位置是否走过
bool Pass(MazeType* M, PosType pos);
//创建新的节点,用step,pos,d初始化该点
SElemType NewSElemType(int step, PosType pos, int d);
//将位置pos的方向设为d
PosType NextPos(PosType pos, int d);
//若迷宫maze中存在从入口start到出口end的通道,则求得一条存放在栈中(从栈底到栈顶)
bool MazePath(SqStack* S, MazeType maze, PosType start, PosType end);
//清空栈
bool ClearStack(SqStack* S);
//从栈底到栈顶依次对每个元素进行访问
bool StackTravel(const SqStack* S);
//返回栈的长度,即S元素的个数
int StackLength(SqStack S);
//若栈不为空,则用e返回S的栈顶元素
bool GetTop(SqStack S, SElemType* e);
#endif
2、maze.c
#include "maze.h"
//构造一个空栈
bool InitStack(SqStack* S)
{
//100*SElemType
S->base = (SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!S->base)
{
printf("申请空间失败,迷宫无法初始化.\n");
return false;
}
S->top = S->base;
S->stacksize = STACK_INIT_SIZE;
return true;
}
//初始化迷宫数据
bool InitMaze(MazeType* M)
{
char mz[ROW][COLUMN]={
{
'#',' ','#','#','#','#','#','#','#','#'},
{
'#',' ',' ','#',' ',' ',' ','#',' ','#'},
{
'#'