迷宫求解Word文件下载.docx

上传人:b****5 文档编号:19456633 上传时间:2023-01-06 格式:DOCX 页数:17 大小:151.05KB
下载 相关 举报
迷宫求解Word文件下载.docx_第1页
第1页 / 共17页
迷宫求解Word文件下载.docx_第2页
第2页 / 共17页
迷宫求解Word文件下载.docx_第3页
第3页 / 共17页
迷宫求解Word文件下载.docx_第4页
第4页 / 共17页
迷宫求解Word文件下载.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

迷宫求解Word文件下载.docx

《迷宫求解Word文件下载.docx》由会员分享,可在线阅读,更多相关《迷宫求解Word文件下载.docx(17页珍藏版)》请在冰豆网上搜索。

迷宫求解Word文件下载.docx

否则沿原路退回,换一个方向继续探索,直到所有可能的通路都探索为止。

给出迷宫的入口和出口及相关的通路,求出从入口到出口的路径。

要求使用C语言编程,定义合适的数据结构。

最后,需要说明设计思想,同时给出能够运行的源程序,并给出对应的程序流程图。

使用一个二维数组来表示迷宫,其中分别用1、0表示通与不通;

算法的基本思想是:

若当前位置“可通”,则纳入“当前路径”,并继续朝“下一位置”探索,即切换“下一位置”为“当前位置”,如此重复,到达出口;

若当前位置“不可通”,则应顺着“来向”退回到“前一通道块”,然后朝“来向”之外的其它方向探索。

若该通道块四周4个方块均“不可通”,则应从“当前路径”中删除该通道块。

使用栈结构记录当前路径,当前位置入栈表示向前行,出栈则表示从当前位置退回。

2.2运行环境

(1)WINDOWS2000/2003/XP/7/Vista系统

(2)VisualC++6.0

2.3开发工具

C语言

3分析和设计

3.1系统分析及设计思路

本课程设计是解决迷宫求解的问题,从入口出发,顺某一方向向前探索,若能走通,则继续往前走;

否则沿原路退回,换一个方向再继续探索,直至所有可能的通路都探索到为止。

为了保证在任何位置上都能沿原路退回,显然需要用一个后进先出的结构来保存从入口到当前位置的路径。

因此,在求迷宫通路的算法中要应用“栈”的思想假设“当前位置”指的是“在搜索过程中的某一时刻所在图中某个方块位置”,则求迷宫中一条路径的算法的基本思想是:

若当前位置“可通”,则纳入“当前路径”,并继续朝“下一位置”探索,即切换“下一位置”为“当前位置”,如此重复直至到达出口;

若当前位置“不可通”,则应顺着“来向”退回到“前一通道块”,然后朝着除“来向”之外的其他方向继续探索;

若该通道块的四周4个方块均“不可通”,则应从“当前路径”上删除该通道块。

所谓“下一位置”指的是当前位置四周4个方向(东、南、西、北)上相邻的方块。

假设以栈S记录“当前路径”,则栈顶中存放的是“当前路径上最后一个通道块”。

由此,“纳入路径”的操作即为“当前位置入栈”;

“从当前路径上删除前一通道块”的操作即为“出栈”。

3.2主要数据结构及算法

3.2.1数据结构设计考虑

1)建立一个二维数组表示迷宫的路径(0表示通道,1表示墙壁);

2)创建一个栈,用来存储“当前路径”,即“在搜索过程中某一时刻所在图中某个方块位置”。

3.2.2逻辑结构存储结构

1)创建一个Int类型的二维数组intmaze[n1][n2],用来存放0和1(0表示通道,1表示墙壁);

2)创建一个结构体用来储存数组信息(数组的横坐标X,数组的纵坐标Y,方向C)结构体:

typedefstructnode

{

intx;

inty;

intc;

}linkstack;

3)创造一个栈包括(top表示栈顶元素)

linkstacktop[n1*n2];

3.2.3主要算法

首先,创建数组的大小,此数组大小要求用户自己输入。

具体算法:

printf("

输入迷宫大小(提示:

行列数不能超过50!

):

"

);

//在此提示用户输入数组大小的界限

scanf("

%d"

&

g);

//再次用scanf来输入使用者要创建的迷宫大小,并且把值赋给g这个参量,用于对与迷宫数组的创建

大小创建完毕,请输入迷宫:

\n"

//用来提示用户要进行下面操作

其次,用户自己定义迷宫的内容(其中自定义迷宫入口(1,0),迷宫的出口为(g-2、h-1)),迷宫的生成算法:

voidshuzu(intg,inth){//创建数组函数,设定参量并从主函数中获得要使用的参量

inta,b;

for(a=0;

a<

g;

a++)

for(b=0;

b<

h;

b++)

maze[a][b]);

}//使用循环来给数组赋值,也就是用来创建迷宫的格式,这是一个自定义的迷宫创建,其中的0和1分别是表示通路和障碍,定义的数组其实就是迷宫的设计图

第三,产生迷宫(其中自定义迷宫入口(1,0),迷宫的出口为(g-2、h-1)),算法:

voidscsu(intg,inth){//创建迷宫输出函数,设定参量并从主函数中获得要使用的参量

inta,b;

生成的迷宫是:

//提示要现实的内容是什么

{for(b=0;

printf(maze[a][b]?

#"

:

"

//使用循环语句来实现迷宫的实化,输出迷宫

}

最后,迷宫寻路,在寻路的时候,我们应从入口(1、0)进入迷宫,当迷宫的入口处有障碍或者出口被堵,再或者没有通路时整个程序结束,并输出迷宫无解的提示。

如果迷宫求解过程中没有出现无解情况,那么在求解的过程中,会输出迷宫的通路路径,并且输出坐标值,让使用者更清楚路径的走法。

在寻路的过程中,每走过一个格,那个格得知就会被赋值为2,用来标记此处已走过,免去了来来回回的重走,以免出现死循环,所以开始时的入口则直接的定义为了2,这样程序就能达到入口,并从入口进入到迷宫当中,如果在迷宫当中没有通路的话,则会使top[i].c的值变为零,这样当其为0时,可以结束循环输出“迷宫无解!

”,则当迷宫如果出现有解时,则到最后的出口时仍然会将top[i].c赋值为0,但是此时的出口处被复制为2,也就是用这个来判断是否存在通路,所以才实现了图中所示的功能。

这样就简单的实现了,有解无解的输出。

从而实现了要求的程序!

代码如下:

switch(方向)

{case0:

//为0时有两种情况走完全程或者没有通路

{run=0;

if(v==1)//当V为1时说明此路没有走到出口就已经没有路了,所以无通路

printf("

此迷宫无通路!

break;

}

case向右:

{if(maze[top[i].x][top[i].y+1]==0)//用来判断此处是否有障碍

{i++;

top[i].x=top[i-1].x;

top[i].y=top[i-1].y+1;

maze[top[i].x][top[i].y]=2;

//进行赋值交换

if(maze[g-2][h-1]==2)v=0;

//如果在这里结束了那么出口处的坐标值变为2,使V等于0

elsetop[i].c+=1;

//如果没有则进行下一步操作(一下各个方向的操作与第一个方向的相同)

break;

剩余的方向:

case向上:

代码操作与向右一样

case向左:

case向下:

其中要寻求所有的通路,在这里则使用了一个do……while循环,这样可以找到所有的通路,其条件使run。

如果run等于1,则进行循环,否则循环结束程序结束。

另外的,菜单操作(图在测试中)则是使用了switch操作,这样可以选择操作的步骤,如果选择1,则迷宫求解开始,如果选择2则直接结束操作(只有两个操作1:

求解2:

退出)。

 

3.3函数流程图

图3.3.1主要设计流程图

图3.3.2生成迷宫流程图

图3.3.3详细设计流程图

图3.3.4以二维数组定义迷宫流程图

4具体代码实现

#include<

stdio.h>

stdlib.h>

#definen150//定义行范围

#definen250//定义列范围

typedefstructnode//创建一个结构体存储数组信息

{

intx;

inty;

intc;

}linkstack;

intmaze[n1][n2];

//创建一个二维数组

linkstacktop[n1*n2];

//创建一个N*N的栈

inti,j,k,m=1,run;

voidshuzu(intg,inth){//以二维数组形式定义迷宫内容

for(a=0;

for(b=0;

scanf("

//输入迷宫对应的数组数据

}

voidscsu(intg,inth){//生成迷宫

printf("

{for(b=0;

printf(maze[a][b]?

//输出迷宫图形

voidmain()

{intg,h,v;

intw;

欢迎使用迷宫求解\n"

迷宫求解请按:

1\n"

退出请按:

2\n"

输入您的选择:

w);

switch(w)//若输入的W为1或2,则继续程序

{case1:

//W为1时

h=g;

//确定数组大小为g维

shuzu(g,h);

for(i=0;

i<

=g*h;

i++)

top[i].c=1;

scsu(g,h);

//生成迷宫

i=0;

top[i].x=1;

//i=0时X方向对应值得和为1

top[i].y=0;

//i=0时Y方向对应值得和为0

maze[1][0]=2;

//入口迷宫值变为2

run=1;

v=1;

do{//定义行走规则和出口判断

if(top[i].c<

5)//若i点可到方向值小于5则向下进行

{if(top[i].x==(g-2)&

&

top[i].y==(h-1))//当i点为出口时所满足的条件

{printf("

第%d条通路是:

m++);

//输出不同的路程

for(j=0;

j<

=i;

j++)

{printf("

(%d,%d)"

top[j].x,top[j].y);

}//输出通路坐标

j++)//求出迷宫路线图形

{for(k=0;

k<

k++)

{if(maze[j][k]==0)

elseif(maze[j][k]==2)

O"

elseprintf("

maze[top[i].x][top[i].y]=0;

i--;

top[i].c+=1;

continue;

switch(top[i].c)

{case0:

{run=0;

if(v==1)

break;

case1:

{if(maze[top[i].x][top[i].y+1]==0)

{i++;

top[i].x=top[i-1].x;

top[i].y=top[i-1].y+1;

maze[top[i].x][top[i].y]=2;

if(maze[g-2][h-1]==2)v=0;

elsetop[i].c+=1;

case2:

{if(maze[top[i].x-1][top[i].y]==0)

top[i].x=top[i-1].x-1;

top[i].y=top[i-1].y;

case3:

{if(maze[top[i].x][top[i].y-1]==0)

top[i].y=top[i-1].y-1;

case4:

{if(maze[top[i].x+1][top[i].y]==0)

top[i].x=top[i-1].x+1;

else

{if(i==0)return;

}while(run==1);

欢迎下次使用!

);

default:

5课程设计总结

5.1课程设计结果或预期结果

图5.1.1迷宫通路

图5.1.2迷宫无解

5.2设计结论

通过此次课程设计,是我对于数据结构有了更深的了解,更新的认识。

数据结构是一门重要的课程,只有数据结构学得扎实了,才能对于计算机有更深的应用,所以学好数据结构是很重要的。

经过两周的上机设计,我实现了简单的迷宫求解,能够简单的实现求解过程。

但是还存在着不足之处,不能输入矩形的数组,而且出口和入口是固定的,也可以改变可是要改变代码,本程序不能循环执行,只能执行一次。

有待改进!

对于此次课程设计,我感慨颇多,从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。

通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,才能提高自己的实际动手能力和独立思考的能力。

实验过程中,使我更加扎实的掌握了有关数据结构方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。

实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。

过而能改,善莫大焉。

在课程设计过程中,我不断发现错误,不断改正,不断领悟,不断获取。

最终的调试运行环节,本身就是在践行“过而能改,善莫大焉”的知行观。

这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后在老师的指导下,终于迎刃而解。

在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可!

此次设计也让我明白了思路即出路,有什么不懂不明白的地方要及时请教老师和同学或上网查询,只要认真钻研,动脑思考,动手实践,就没有弄不懂的知识,收获就多。

参考文献

[1]徐孝凯,贺桂英著.C语言教程[M].北京:

清华大学出版社,2004.

[2]张福祥,王萌.C语言程序设计习题解答与实验实训[M].沈阳:

辽宁大学出版社,2008.

[3]黄同成,黄俊民等.数据结构.北京:

中国电力出版社,2008.2

[4]齐德昱.算法与数据结构[M].北京:

清华大学出版社,2003.10.

致谢

这次课程设计让我收获不少,虽然这次我这组的课程设计题目不是很难,但我也花了很多时间去做,认真完成了此次课程设计。

在李仲生老师的指导下,我得以顺利地完成本次课程设计,并努力使设计更加完美。

李老师严谨求实的治学态度,踏实坚韧的工作精神,将使我终生受益。

在此,我要感谢李老师对我的帮助。

谢谢!

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 互联网

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1