课程设计——迷宫问题(C++)

该博客探讨了如何使用C++解决迷宫问题,包括设计一个基于链表的栈来存储路径,以及非递归算法寻找从入口到出口的路径。文章详细介绍了迷宫的表示方法,使用二维数组并添加障碍边界,以及程序的三大模块:主程序、栈和迷宫模块的设计原理。同时,还提出了递归算法以找到所有可能的通路,并计划以方阵形式输出迷宫和其路径。
摘要由CSDN通过智能技术生成
迷宫问题
1设计目的、要求
以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。
基本要求:
首先实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,d)的形式输出,其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向,如:对于下列数据的迷宫,输出的一条通路为:(1,1,1),(1,2,2),(3,2,3),(3,1,2),…。
(1)编写递归形式的算法,求得迷宫中所有可能的通路;
(2)以方阵形式输出迷宫及其通路。
2设计原理
主要采取三大模块:主程序模块、栈模块和迷宫模块
栈模块:实现迷宫数据的抽象化和对迷宫数据的处理;
迷宫模块:实现迷宫数据抽象类型;
主程序模块:初始化迷宫模块。
3采用软件、设备
Microsoft Visual C++ 6.0 微型电子计算机
4设计内容
1、迷宫模块:
以二维数组Maze[m+2][n+2]表示迷宫,其中:Maze[0][j]和Maze[m+1][j](0<=j<=n+1)及Maze[i][0]和Maze[i][n+1] (0<=i<=n+1)为添加的一圈障碍。数组中一元素值为0表示通路,1表示障碍,限定迷宫的大小m,n<=10。其中迷宫的入口位置和出口位置可由用户随时设定。
1.坐标位置类型:
struct PosType /* 迷宫坐标位置类型 */
{
int x; /* 行值 */
int y; /* 列值 */
};

2.迷宫类型:
#define MAXLENGTH 25 /* 设迷宫的最大行列为25 */
typedef int MazeType[MAXLENGTH][MAXLENGTH];
3.记录坐标的三个一元数组:
int a[MAXLENGTH];
int b[MAXLENGTH];
int c[MAXLENGTH];
2、栈模块:
1.栈类型SElemType:
struct SElemType/* 栈的元素类型 */
{
int ord; /* 通道块在路径上的"序号" */
PosType seat; /* 通道块在迷宫中的"坐标位置" */
int di; /* 从此通道块走向下一通道块的"方向"(0~3表示东~北) */
};
2.构造一个栈SElmType:
struct SqStack //SqStack
{
SElemType *base; /* 在栈构造之前和销毁之后,base的值为NULL */
SElemType *top; /* 栈顶指针 */
int stacksize; /* 当前已分配的存储空间,以元素为单位 */
}; /* 顺序栈 */
其中基本操作如下:
栈的初始化:
bool InitStack(SqStack *S)
{ /* 构造一个空栈S */
(*S).base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!(*S).base)
exit(1); /* 存储分配失败 */
(*S).top=(*S).base;
(*S).stacksize=STACK_INIT_SIZE;
return true;
}
元素进栈:
bool Push(SqStack *S,SElemType e)
{ /* 插入元素e为新的栈顶元素 */
if((*S).top-(*S).base>=(*S).stacksize) /* 栈满,追加存储空间 */
{
(*S).base=(SElemType *)realloc((*S).base,((*S).stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!(*S).base)
exit(1); /* 存储分配失败 */
(*S).top=(*S).base+(*S).stacksize;
(*S).stacksize+=STACKINCREMENT;
}
*((*S).top)++=e;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值