- 1、本文档共31页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
计算机科学与工程系
数据结构课程设计报告
课程设计题目 迷宫
航班信息查询系统
学 号
姓 名
班 级
专 业 网络工程
完 成 时 间 2013-1-4
指 导 教 师
题目一
1.设计内容
1.1问题描述
求迷宫从入口到出口的所有路径。
1.2设计要求
1.迷宫中不能使用递归算法查找路径。
2.试探方向限定为上、下、左、右四个方向。
3.迷宫采用随机生成和手工生成两种方式。
4.生成从迷宫入口到出口的最短和最长路径。
5.迷宫的入口和出口由键盘输入。
1.3开发环境
Visual C++6.0的集成化环境
1.4研究思路
对这样的矩形迷宫,可以用N*M的矩阵来描述,N和M分别代表迷宫的行数和列数。这样,迷宫中的每一个位置都可以用行号和列号来指定。从入口到出口的路径则是由一个位置构成的,每个位置上都没有障碍,且每个位置(第一个除外)都是前一个位置的东、南、西或北的邻居。为了描述迷宫中位置(i,j)处有无障碍,规定:当位置(i,j)处有一个障碍时,其值为1,否则为0。
经分析,一个简单的求解方法是:从入口出发,沿某一方向进行探索,若能走通,则继续向前走;否则沿原路返回,换一方向再进行搜索,直到所有可能的通路都探索到为止。即所谓的回溯法。
2.设计步骤
2.1 需求分析
(1)题目:迷宫的生成与路由。生成一个N*M(N行M列)的迷宫,0和1分别表示迷宫中的通路和障碍,设计一个程序,完成迷宫的组织与存储,并实现迷宫的路由算法。即对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。
(2)设计要求:(1)N和M是用户可配置的,缺省值为50和50。(2)迷宫的入口和出口分别在左上角和右下角。(3)求得的通路以二元组( i , j )的形式输出,其中(i, j)指示迷宫中的一个坐标。(4) 以二维数组存储迷宫数据。
(3)该程序是迷宫的生成与路由。生成一个N*M(N行M列)的迷宫,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。
2.2 概要设计
(1)数据结构的选择
解决此问题需要运用到链栈的数据结构。因为计算机解迷宫时,通常用的是“穷举求解”的方法,为了保证在任何位置上都能沿原路退回,显然需要用一个后进先出的结构来保存从入口到当前位置的路径。,在求迷宫通路的算法中应用“栈”也就是自然而然的事了。{
int row; //行
int col; //列
struct node * next;
}mlink;
用途:该结构体用来存储迷宫中的行坐标和列坐标。
3)迷宫最大行列数定义:
#define MaxX 50 //迷宫最大行数
#define MaxY 50 //迷宫最大列数
用途:用来定义迷宫的最大尺寸为50*50。
(2)函数之间关系:
在该程序中,首先进入的是菜单选择,在菜单中有3种选择,选1是手动输入迷宫函数;选2是随机自动生成迷宫;选3是退出程序。在手动生成迷宫时,有两种输出方式,一是矩阵输出,二是图形输出。在矩阵输出时,直接将数组中的数进行输出,在图形输出时,则要判断该点的情况,然后输入迷宫的出入口,再调用mgpath()函数进行判断是否存在路径,如果存在则将路径经过的点进行输出,并且将经过的点进入到辅助数组中(辅助数组是辅助图形界面的输出),并且将辅助数组初始为1,辅助数组中点为路径的重新赋值为0,然后根据情况输出图形界面。在自动生成迷宫时,用到了c语言随机函数,对于其它问题,和手动情况基本相同。
2.3 详细设计
(1)主菜单伪代码:
while(flag1){
printf(############################################\n);
printf(# *********选择菜单********** #\n);
printf(# 1-手动生成迷宫 2-自动生成迷宫 3-退出 #\n);
printf(############################################\n);
printf(输入选项:);
scanf(%d,choice);
switch(choice){
case 1://手动建立迷宫
case 2: //自动建立迷宫
case 3:printf(谢谢使用\n);exit(0);
}
}
(2)手动建立迷宫:
文档评论(0)