2022年用C语言解决迷宫设计与寻找通路的问题知识 .pdf
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《2022年用C语言解决迷宫设计与寻找通路的问题知识 .pdf》由会员分享,可在线阅读,更多相关《2022年用C语言解决迷宫设计与寻找通路的问题知识 .pdf(30页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、用 C 语言解决迷宫设计与寻找通路的问题摘要本课程设计主要解决设计一个迷宫以及在给出一组入口和出口的情况下,求出一条通路的问题。在课程设计中,系统开发平台为 Windows 2000 ,程序设计语言采用 Visual C+6.0,数据结构采用链式栈存储结构,程序运行平台为Windows 98/2000/XP 。对于迷宫设计问题,首先假设了用“ 0”表示此道路可通, “1”表示不可通,即障碍,然后采用了简单的以时间产生随机种子 (0,1 变量)和人工输入 0-1变量的方法产生迷宫矩阵。对求解迷宫通路问题,采用“穷举求解”的方法和设计一个“先进后出”的栈来存放当前位置路径,最后得出一条动态行走迷宫
2、的通路。在程序设计中,采用了结构化与面向对象两种解决问题的方法。程序通过调试运行,初步实现了设计目标。关键词程序设计;C+6.0;链式栈存储结构;0-1;穷举求解名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 30 页 - - - - - - - - - 1 引言本课程设计主要解决设计一个迷宫以及在给出入口和出口的情况下求解一条通路的问题。利用“穷举求解”的方法来判定当前位置是否可通以及利用栈“先进后出”的特点来存放当前位置可通的信息。1.1课程设计目的在我们对一个具体的
3、问题进行分析时,往往要抽象出一个模型, 设计一个算法来实现所需要达到的功能。在此程序中,我们主要是综合运用所学过的知识,回顾VC+编程的同时,熟悉并掌握数据结构中的算法分析与设计。同时,要掌握类 C 语言的算法转换成 C程序并上机调试的基础;通过本次课程设计,进一步巩固C 语言和数据结构课程所学的知识,特别是加强数据结构的理解与运用,熟悉面向对象的程序设计方法;通过此次课程设计的实践,锻炼自身程序设计的能力以及用 C 语言解决实际问题的能力,为以后后续课程的学习以及走上社会打好基础。1.2课程设计内容根据对题目的分析和设想,首先,设计一个链式栈存储结构,动态的对迷宫数据进行操作(主要为入栈和出
4、栈) ;其次,定义一个二维数组和一个备份数组,用于存放迷宫数据,并在构建迷宫中,要完成对手动建立迷宫和自动建立迷宫方法的设计,并能输出原始迷宫信息和原始图形信息;再次,当程序接受外部输入一组入口、出口数据后,能完成对该迷宫矩阵计算出是否存在通路的情况,若存在通路,则分别用坐标通路和图形通路输出该通路,否则输出无通路的信息;最后,设计完成实现多次输入入口和出口数据后,计算出不同结果的情况,并能分别显示出对应信息。1.3概要设计名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共
5、30 页 - - - - - - - - - 计算机解迷宫通常用的是“穷举求解”方法,即从入口出发,顺着某一个方向进行探索,若能走通,则继续往前进;否则沿着原路退回,换一个方向继续探索,直至出口位置,求得一条通路。假如所有可能的通路都探索到则未能到达出口,则所设定的迷宫没有通解1。可以用二维数组存储迷宫数据,通常设定入口点的下标为( 1,1) ,出口点的下标为(n,n) 。为处理方便起见,可以迷宫的四周加一圈障碍。对于迷宫任一位置,均可约定有东、南、西、北四个方向可通。最后,以方阵、坐标和图形形式输出迷宫及其通路。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - -
6、 - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 30 页 - - - - - - - - - 2 程序设计说明2.1 定义抽象数据类型1、设定迷宫的抽象数据类型为ADT maze 数据对象: D= ai ,j ? 、 ,0=i=m+1,0=j=n+1,m,n=50 数据关系: R= ROW ,COL ROW=| ai-1, j, ai,j ?D,i=1, ,m+1,j=0, ,n+1 COL=| ai,j-1 ,ai,j ?D,i=1, ,m+1,j=0, ,n+1 基本操作: create(&mazeN+2,a,b) 初始条件:二维数组mazea+
7、2b+2 已存在,其中自第 1 行至第 a+1行、 每行中自第 1 列至第 b+1列的元素已有值,并且以值0 表示通路,以值 1 表示障碍。操作结果:构造迷宫的0-1 数组,以“ 0”表示通路,以“ 1”表示障碍,并在迷宫四周加上一圈障碍。prin(&mazeN+2,a,b) 初始条件:迷宫 maze已被赋值。操作结果: 打印 maze迷宫 0-1 矩阵以及图形矩阵, 表示通路,表示障碍。 MazePath( &maze,x1,x2,y1,y2) 初始条件:迷宫maze已被赋值。操作结果:从入口( x1,y1 )开始,判定当前位置是否可通,可通就入栈并判断下一个方向是否可通,按具体名师资料总结
8、 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 30 页 - - - - - - - - - 情况做入栈和出栈处理,直到出口(x2,y2 )为止。printonglu1() 初始条件:栈 stack 不空。操作结果:出栈,得到一条从入口到出口的通路printonglu2(int a,int b) 初始条件:迷宫 maze已存在。操作结果: 若迷宫 maze中存在一条通路, 则按照如下规定改变迷宫 maze的状态;以字符、 、表示当前路径上往下一位置的方向,字符“”表示出口 , 打印迷
9、宫矩阵。 ADT maze 2.2 定义栈结构体及二维数组1、定义堆栈结构typedef struct node /堆栈结构 int row; /行int col; /列struct node *next; Mlink; Mlink *stack;/ 定义一个栈2、定义二维数组int mazeM+2N+2; int backupM+2N+2; /备份数组2.3 主程序模块main() 设置背景颜色;输入矩阵的大小 a,b; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共
10、30 页 - - - - - - - - - 建立矩阵;备份矩阵;While(k!=0) 打印原始矩阵以及图形矩阵;输入入口和出口位置;判定有无通路;输出结果;输入 k 值,判定下一步的操作; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 30 页 - - - - - - - - - 3 详细实现3.1 流程图(1)主要设计思想流程如下3.1图所示:图 3.1 主要设计思想流程图(2)详细设计流程图通过对本问题的分析与概括和程序的分析,可得出如下 3.2图的详细设计程序
11、流程图:设计栈结构体设计各种所需的函数设计 main 函数创建迷宫矩阵开始结束名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 30 页 - - - - - - - - - 图 3.2 程序流程图3.2 算法说明该程序用于解决设计一个迷宫, 并在此基础上给出一组入口和出口数据后能判定从该入口位置起是否有通路达到出口位置,有通路则输出坐标通路和图形通路两种方式, 否则输出无通路的信息。 本程序分两大模块, 迷宫模块和主程序开始输入数组行列值建立迷宫矩阵并备份迷宫信息判 断 变
12、量 k 是否为 0 打印迷宫矩阵原始信息输入入口和出口坐标信判定MazePath 值是否为1N Y 结束输出坐标通路以及图形通路输出无通路N Y 用局部备份数组信息还原迷宫矩阵和全局备份数组名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 30 页 - - - - - - - - - 模块,迷宫模块又包括建立迷宫矩阵函数、输出迷宫矩阵原始信息函数、判断通路函数和输出最终信息函数(包括输出坐标通路函数和输出图形通路函数两种)五大函数,主程序模块主要为调用函数和while 语句
13、来判定是否重复执行操作。其中建立迷宫矩阵函数包括手动建立和自动建立两种功能,手动建立即人为的输入 0-1 数据,直至达到二维数组大小的要求,自动建立是利用时间来产生随机种子,从而建立满足大小的二维数组矩阵;输出迷宫矩阵原始信息函数的功能是首先输出带有行列号的0-1 矩阵,再输出以表示通路,表示障碍的图形矩阵;判断通路函数首先判定由实参传递过来的入口坐标位置是否可通,然后再决定是否将其入栈,之后再执行后续操作,即若入口可通,则入栈,然后判定该位置的四方相邻的方向, 若有一个方向的相邻位置可通, 则将该相邻位置入栈,依次方法穷举求解下去, 若能到达出口位置, 最后将出口位置入栈并返回函数值“1”,
14、否则返回函数值“ 0”;输出坐标通路函数的功能是若存在通路,则利用栈“先进后出” 的特点输出从入口到出口的一条通路;输出图形通路函数的功能是若存在通路, 利用栈中元素作比较, 将栈中元素的信息和二维数组作比较,将二维数组对应位置上的图形改为、并输出。在主程序中,首先调用建立迷宫矩阵函数建立一个迷宫,然后用while语句来选择是否重复执行来求取不同通路。3.3主要算法设计(1) 、结构体的定义typedef struct node /堆栈结构 int row; /行int col; /列struct node *next; Mlink; Mlink *stack;/定义一个栈(2)、主要函数声明
15、void create(int mazeN+2,int a,int b) / 建立迷宫名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 30 页 - - - - - - - - - void prin(int mazeN+2,int a, int b) /打印迷宫矩阵intMazepath(intmazeN+2,intx1, intx2, inty1, int y2) / 判定迷宫通路void printonglu1() / 输出坐标通路void printonglu2(i
16、nt a, int b) /输出图形通路void main() / 主函数 system(color f0); / 背景为白色int k=1,a,b; int mazeM+2N+2;/ 迷宫矩阵int abcM+2N+2,p,q; / 备份数组以重复使用迷宫printf( 建立迷宫!n); printf( 输入迷宫矩阵的行列数 M,N!n); scanf(%d%d,&a,&b); create(maze,a,b); / 建立迷宫for (p=0;p=a+2;p+) for (q=0;q=b+2;q+) abcpq=mazepq; while(k!=0) (3)、主要变量说明名师资料总结 - -
17、 -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 30 页 - - - - - - - - - M、N:预定义 M 和 N 的值,表示二维数组的大小;a、b:用于接收外部输入的值,按操作者意愿建立一定大小的迷宫;p::栈指针,动态分配地址值;row、col:二维数组的行列值,分别接收变量 a、b 的值,使二维数组大小为 mazeab ;next :指向下一节点指针。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理
18、- - - - - - - 第 11 页,共 30 页 - - - - - - - - - 4 运行环境与结果4.1 运行环境Microsoft Visual C+6.0 。Visual C+(简称 VC)是 Microsoft 公司推出的目前使用极为广泛的基于 Windows平台的 C+可视化开发环境。Visual C+6.0提出的控制台应用程序对学习和掌握标准的 C/C+内容非常有利。 “可视”的资源编辑器与 MFC类以及应用程序向导,为快速高效的开发出功能强大的 Windows应用程序提供了极大的方便。利用 Visual C+6.0进行 Internet 、数据库及多媒体等多方面的程序开
19、发也很容易2。4.2 运行过程中遇到的问题与处理方法在设计本程序之初,本人遇到的第一个问题就是如何建立一个迷宫矩阵,难道要手动的一个个输入数据吗?如果建立10 阶以上的矩阵不是要输入100 个以上的元素, 这对现实来说是不可行的。 经过翻查资料后, 我才知道能利用时间产 生 随 机 种 子 , 所 用 函 数 为srand(time(), 再 用i1=(int)(rand()%a)+1;j1=(int)(rand()%b)+1 ; mazei1j1=(int)(rand()%2) 语句产生 0-1变量, 并且这种方法是经过验证的产生 0 元素较多的方法,即通过这种方法产生的迷宫矩阵有多条通路。
20、基于这种方法和我们惯常的想法,我在编算法时提供了“手动建立”和“自动建立”两种方法来创建迷宫矩阵。随着程序设计的深入,我便遇到了第二个问题,与其说是问题,不如说是选择。在判定迷宫中是否存在通路时,要设计一个栈来存放数据,在选择用链式栈还是顺序栈之间我徘徊了很久,因为在网上我看到的类似算法中都是用顺序栈来实现迷宫通路的判定,进而构建了一些关于栈的相关算法,程序不仅显得冗长而且多了些不必要的操作,如判定栈是否空或满,而用链栈不仅不需要判定栈满,也只是涉及栈的入栈和出栈操作,程序简洁明了,因此我就废弃前人的成果自己另写了个算法,这对我来说确实是个挑战。之后虽然又遇到了几个问题,但都是小问题,一下就解
21、决了,所以在此不再说明。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 30 页 - - - - - - - - - 4.3 运行结果与分析(1) 、自动建立迷宫矩阵情形对程序进行编译运行后,窗口弹出如图4.1 的信息:图 4.1 自动建立 20*20 迷宫矩阵这是在操作者输入矩阵的行列数 M、N 并选择功能键“2(自动建立) ”后所显示的界面。当我们再按下键盘上的任意键后,界面就会显示如图 4.2图 4.3中的信息:图 4.2 自动建立 20阶矩阵后的迷宫数字信息名师
22、资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 30 页 - - - - - - - - - 图 4.3 自动建立 20 阶矩阵后的迷宫图形信息界面中在显示上示信息后并立刻弹出如下信息,如图4.4 :图 4.4 等待输入入口和出口的运行界面在本次输入中,输入的一组数据如上图所示为入口 (1/1) 、 出口 (20/20) ,当输入完成后, 按回车键,程序就进入到基于前面输入的数据判定迷宫中是否存在一条从入口到出口的通路,并在判定完成后显示如图4.5 、4.6 中的信息:图
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年用C语言解决迷宫设计与寻找通路的问题知识 2022 年用 语言 解决 迷宫 设计 寻找 通路 问题 知识
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内