《数据结构》课程设计-迷宫求解

这是我自己去年写的,现在发布仅供参考

1 设计目标
迷宫问题:编写一个程序求解迷宫问题。迷宫以m行n列的长方阵表示,0和1分别表示迷宫中通路和障碍。设计一个程序,对任意设定的迷宫,求出一条入口到出口的通路,或得出没有通路的结论。 算法要点:随机创建迷宫,观察不同难度的迷宫,选择帮助时给出迷宫的一个路径解。
2 课题分析与设计
2.1 课题需求分析
1、本程序实现迷宫的探索过程. 以用户和计算机对话的方式,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令,然后程序就探索路径并输出路径。
2、本演示程序中,输入形式以“回车符”为结束标志,且允许出现重复字符。 
3、利用二维数组实现迷宫位置的存储,并用栈存贮探索路径,每个结点含三个整形变量。输入的形式以回车结束。
4、本程序中,用户可以输入(3-100)之间任意大小的迷宫,然后程序自动生成随机迷宫,用户在选择帮助时,系统自动寻找并输出迷宫的路径
2.2 存储结构设计
数据的存储结构:也称为数据的物理结构,是数据的逻辑结构在计算机中的实现。需要指出的是,数据的逻辑结构是从数据元素之间的逻辑关系来分析数据的,与数据的具体存储无关,是独立于计算机之外的。而数据的存储结构是依赖于计算机的,包括数据元素值在计算机中的存储表示和逻辑关系在计算机中的存储表示。数据元素之间逻辑关系在计算机中的存储表示分为以下四种:
顺序存储方式:顺序存储方式是指将所有的数据元素放在一段连续的存储空间中,并使逻辑上相邻的数据元素其对应的物理存储位置也是相邻的(即保证逻辑位置关系与物理位置关系的一致)。顺序存储结构通常借助程序设计语言中的数组来加以实现。
链式存储方式:链式存储方式不需要将逻辑上相邻的元素存储在物理位置相邻的位置,也就是说数据元素的存储具有任意性。每个数据元素所对应的存储表示由两部分组成,一部分存储元素值本身,另一部分用于存放表示逻辑关系的指针。我们可以认为指针给出的是下一个数据元素的存储地址。
索引存储方式:索引存储方式在存储数据元素的同时还增加了一个索引表。索引表中的每一项包括关键字和地址,关键字是能够唯一标示一个数据元素的数据项,地址是指示数据元素的存储地址或者存储区域的首地址的。
散列存储方式:散列存储也称为哈希存储,这种存储方式将数据元素存储在一个连续的区域,每一个数据元素的具体存储位置是根据该数据的关键字值,通过散列(哈希)函数直接计算出来的。
本实验采用的是顺序储存方式。
2.3 算法设计
1.定义迷宫类型大小,可以自定义修改#define SIZE 102//迷宫的最大范围
2.创建一个结构体用来储存数组信息(数组的横坐标X,数组的纵坐标Y,方向dir)
typedef struct{ int x; int y;}PosType;//坐标位置
typedef struct { PosType seat; //通道块在迷宫中的"坐标位置
" int di; //从上一通道块走向此通道块的"方向"}
SElemType;
3.创建随机迷宫
void Random(int (*mg)[SIZE],
int size,PosType start,
PosType end);void PrintMaze(int (*mg)
[SIZE],int size);//打印迷宫Status Check(char &choice);
//确认输入正确 int main(){
stack s;
int mg[SIZE][SIZE]={1},size;
PosType start,end; char choice;
system(“mode con cols=220 lines=220”);
4.设置打印路径
Status MarkPath(PosType e,int (mg)[SIZE],
int di);PosType FrontPos(PosType e,
int dir);
Status PathPrint(stack s,int (mg)[SIZE]);
PosType NextPos(PosType e,int dir){ PosType E;
switch(dir){ case 1:E.x=e.x+1; //向右
E.y=e.y;
break;
case 2:E.x=e.x; //向下
E.y=e.y+1; break;
case 3:E.x=e.x-1; //向左 E.y=e.y; break;
case 4:E.x=e.x; //向上 E.y=e.y-1; break;
} return E;}
5 总结
5.1 收获 通过这段时间的课程设计,本人对计算机的应用,数据结构的作用以及C语言的使用都有了更深的了解。尤其是C语言的进步让我深刻的感受到任何所学的知识都需要实践,没有实践就无法真正理解这些知识以及掌握它们,使其成为自己的财富。在理论学习和上机实践的各个环节中,通过自主学习和请教老师,我收获了不少。当然也遇到不少的问题,也正是因为这些问题引发的思考给我带了收获。 编写迷宫,开始时手动创建,但是50
50 100
100的迷宫输出太费时间,所以改成自动随机生成迷宫
,void Random(int (*mg)
[SIZE],int size,PosType start,PosType end);
可是问题来了,由于随机性太大,导致每次随机生成迷宫都是无解的,也就是障碍太多,导致很多次起始点和终点都是障碍没有路,所以必须调整路与障碍的比率,所以有
for(i=1;i<size-1;i++)
for(j=1;j<size-1;j++){
k=rand()%4; //随机生成0、1、2、4三个数
if(k) mg[i][j]=0;
else{
mg[i][j]=1; }//else
}
通过设置k=rand()%4;的数字来改变障碍与路的比例,一般3-5,高于五的话,有路的概率接近100%,3出现有解的概率稍微低一点,所以选择4,有解无解的概率相等。
源码就不用了吧,都给你这么多的思路了

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酷爱码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值