【C/C++】迷宫问题详情分析--栈的应用

引言

这是一个简单的顺序栈的应用求解迷宫问题,主要分享的是在求解这个问题的之前的准备,
分析所需的数据,获得正确的数据结构,分析所需要的功能,划分模块,再分析各模块中,需要的具体功能,以确定功能函数。
这样也书写代码时,就可以事半功倍。

一,问题描述

迷宫求解问题
提出以一个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]={
   	
	{
   '#',' ','#','#','#','#','#','#','#','#'},
	{
   '#',' ',' ','#',' ',' ',' ','#',' ','#'},
	{
   '#'
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值