123使用C语言解决迷宫问题.docx

上传人:b****6 文档编号:3046340 上传时间:2022-11-17 格式:DOCX 页数:16 大小:156.32KB
下载 相关 举报
123使用C语言解决迷宫问题.docx_第1页
第1页 / 共16页
123使用C语言解决迷宫问题.docx_第2页
第2页 / 共16页
123使用C语言解决迷宫问题.docx_第3页
第3页 / 共16页
123使用C语言解决迷宫问题.docx_第4页
第4页 / 共16页
123使用C语言解决迷宫问题.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

123使用C语言解决迷宫问题.docx

《123使用C语言解决迷宫问题.docx》由会员分享,可在线阅读,更多相关《123使用C语言解决迷宫问题.docx(16页珍藏版)》请在冰豆网上搜索。

123使用C语言解决迷宫问题.docx

123使用C语言解决迷宫问题

前言

1什么是数据结构?

数据结构是计算机存储、组织数据的方式。

数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。

数据结构在计算机科学界至今没有标准的定义。

各个大家根据自己的理解,都有不同的表述方式(如:

LobertL.Kruse在《数据结构与程序设计》一书中,将一个数据结构的设计过程分成抽象层、数据结构层和实现层。

其中,抽象层是指抽象数据类型层,它讨论数据的逻辑结构及其运算,数据结构层和实现层讨论一个数据结构的表示和在计算机内的存储细节以及运算的实现。

)。

数据结构具体指同一类数据元素中,个元素之间的相互关系,包括三个组成成分,数据的逻辑结构,数据的存储结构和数据运算结构。

2学习数据结构有什么用?

有很多同学都认为学习数据结构没有多大用处,下面是作者在网上的一些疑问。

同学甲:

我学数据结构觉得它类似与高中时的数学,很难!

但是没用……好像就专门来考验一个人逻辑思维用的,为了要在同学间获得很聪明的虚荣,拼命的研究,从来也没有思考过到底它有什么用处。

同学乙:

老师总是对我们说想要在IT行业中有所成就就必须学好数据结构,但是我们现在学的这些什么栈、数组、图、树之类的东西,好像和我们编程没有什么联系。

现在我们先来说说学习数据结构的意义

数据结构是计算机科学与技术专业、计算机信息管理与应用专业,电子商务等专业的基础课,是十分重要的核心课程。

所有的计算机系统软件和应用软件都要用到各种类型的数据结构。

因此,要想更好地运用计算机来解决实际问题,仅掌握几种计算机程序设计语言是难以应付当前众多复杂的课题。

要想有效地使用计算机、充分发挥计算机的性能,还必须学习和掌握好数据结构的有关知识。

打好"数据结构"这门课程的扎实基础,对于学习计算机专业的其他课程,如操作系统、数据库管理系统、软件工程、编译原理、人工智能、图视学等都是十分有益的。

对于数据结构有什么用,人们就用了几点总结出来:

1程序=结构数据+算法;

2数据结构,总的来说,就是你的编程的基本功;

3语言更新太快,数据结构不可能过时;

4算法是对数据的处理;

5数据结构是以后编程的重中之重的基础!

没有数据结构就没有编程这一说!

你的技术越高,数据结构越显重要!

 

一问题定义

迷宫实验是取自心理学的一个古典实验。

在该实验中,把一只老鼠从一个无顶大盒子的门放入,在盒中设置了许多墙,对行进方向形成了多处阻挡。

盒子仅有一个出口,在出口处放置一块奶酪,吸引老鼠在迷宫中寻找道路以到达出口。

对同一只老鼠重复进行上述实验,一直到老鼠从入口到出口,而不走错一步。

老鼠经多次试验终于得到它学习走迷宫的路线。

设计一个计算机程序对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。

二可行性研究

科学技术快速发展的今天,我们也是有各种各样的娱乐生活,小朋友是祖国的未来,在哪个时代都是应该被重视的,小朋友的生活中娱乐智力开发显得格外重要,迷宫游戏就是小朋友们非常熟悉的一种智力开发游戏,现在我们就为这种游戏开发一种能寻找路径的程序,为小朋友提供答案参考。

 

迷宫问题处理系统的功能级数据流图

三需求分析

所求路径必须是简单路径(即在求得的路径上不能重复出现同一个通道块)。

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

若当前位置“可通”,则纳入“当前路径”,并继续朝“下一个位置”探索,即切换到“下一位置”为“当前位置”,如此重复直至到达出口;若当前位置“不可通”,则顺着“来向”退回到“前一通道块”,然后朝着除“来向”之外的其他方向继续探索;若该通道快的四周4个方块均“不可通”,则应从“当前路径”上删除该通道块。

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

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

由此,“纳入路径”的操作即为“当前位置入栈”;“从当前路径上删除前一通道块”的操作即为“出栈”。

四总体设计

4.1数据结构设计考虑

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

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

4.2逻辑结构存储结构

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

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

Typedefstructnode

{

intx;

inty;

intc;

}linkstack;

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

Linkstacktop[n1*n2];

4.3程序流程图

程序流程图

五详细设计

1创建数组的大小,数组的大小要求用户自己定义。

具体的算法:

printf(“请输入迷宫的大小;”);//输入的大小就规定了数组大小的界限

scanf(“%d”,&g);//再次用scanf来输入使用者要创建的迷宫大小,并且把值赋给g这个参量,用于对于迷宫数组的创建

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

\n”);//此步用来提示用户输入迷宫

2用户自己定义迷宫的内容(其中自定义迷宫入口(1,0),迷宫的出口为(g-2,h-1))

迷宫的生成的算法:

voidsz(intg,inth)

{

//创建数组函数,设定参量并从主函数中获得要使用的参量

inta,b;

for(a=0;a

for(b=0;b

scanf(“%d”,&maze[a][b]);

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

3产生迷宫(其中自定义迷宫入口(1,0),迷宫的出口为(g-2,h-1))

算法:

voidscsu(intg,inth)

{

//创建迷宫输出函数,设置参量并从主函数中获得要使用的参量

inta,b;

printf(“生成的迷宫:

\n”);

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

for(a=0;a

{

for(b=0;b

printf(maze[a][b]?

“#”:

“”);

printf(“\n”);

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

}

}

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

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

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

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

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

从而实现了要求的程序!

代码:

switch

{

case:

//为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;

}

……

}

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

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

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

 

六编码

#include

#include

#include

#include

typedefintStatus;

#defineOK1

#defineERROR0

#defineSTACK_INIT_SIZE100

#defineSTACKINCREMENT10

typedefstruct

{

introw;

intline;

}PosType;

typedefstruct

{

intord;

PosTypeseat;

intdi;

}SelemType;

typedefstruct

{

SelemType*base;

SelemType*top;

intstacksize;

}SqStack;

StatusInitStack(SqStack*S)

{

S->base=(SelemType*)malloc(STACK_INIT_SIZE*sizeof(SelemType));

if(!

S->base)

exit(-2);

S->top=S->base;

S->stacksize=STACK_INIT_SIZE;

returnOK;

}

StatusPush(SqStack*S,SelemType*e)

{

if(S->top-S->base>=S->stacksize)

{

S->base=(SelemType*)realloc(S->base,

(S->stacksize+STACKINCREMENT)*sizeof(SelemType));

if(!

S->base)

exit(-2);

S->top=S->base+S->stacksize;

S->stacksize+=STACKINCREMENT;

}

*S->top++=*e;

returnOK;

}

StatusPop(SqStack*S,SelemType*e)

{

if(S->top==S->base)

return0;

*e=*--S->top;

returnOK;

}

StatusStackEmpty(SqStack*S)

{

if(S->top==S->base)

returnOK;

else

returnERROR;

}

voidInitMaze(intmaze[11][11])

{

inti,j;

srand((int)time(NULL));

for(i=0;i<10;i++)

maze[0][i]=0;

for(i=1;i<

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

当前位置:首页 > 法律文书 > 调解书

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

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