迷宫问题实验报告c编写附源代码汇总Word格式.docx
- 文档编号:18609329
- 上传时间:2022-12-29
- 格式:DOCX
- 页数:19
- 大小:106.63KB
迷宫问题实验报告c编写附源代码汇总Word格式.docx
《迷宫问题实验报告c编写附源代码汇总Word格式.docx》由会员分享,可在线阅读,更多相关《迷宫问题实验报告c编写附源代码汇总Word格式.docx(19页珍藏版)》请在冰豆网上搜索。
intdirection;
//从当前结点走至下一个结点的方向
};
基本操作:
A.Mazecreat_manual()
初始条件:
无
操作结果:
手动创建一个迷宫。
B.Mazecreat_automatic()
操作结果:
自动创建一个迷宫。
C.intfound(intx,inty,Point*head)
存在一个存放结点的链栈
查找栈中是否有head指针内所含的坐标;
若含,则返回1,否则返回0。
D.Point*find_road(Mazea)
存在一个迷宫
返回一条通路或者NULL
E.voiddisplay(Point*po,Mazea)
输出结果。
程序包含6个函数:
主函数main()
手动创建一个迷宫Mazecreat_manual();
自动创建一个迷宫Mazecreat_automatic();
查找栈中是否有head指针内所含的坐标intfound(intx,inty,Point*head);
迷宫寻路函数Point*find_road(Mazea);
显示迷宫信息函数voiddisplay(Point*po,Mazea);
各函数间关系如下:
4.详细设计
1)定义迷宫结构体
typedefstruct
}Maze;
}Point;
迷宫的基本操作如下
3)Mazecreat_manual()//手动创建迷宫
输入迷宫的行数和列数;
依次输入各点的值;
4)Mazecreat_automatic()//自动创建迷宫
输入迷宫的行数和列数;
随机产生各点的值;
入口结点和出口结点赋值为0;
打印迷宫;
5)intfound(intx,inty,Point*head)
查找栈中是否有head指针内所含的坐标
若含,则返回1;
否则返回0
6)Point*find_road(Mazea)//迷宫寻路函数,返回一条通路或者NULL
{intj,find,x,y;
do
{while(方向j<
4)
{find=0;
switch(j)//1234分别表示东南西北
{case1:
if(纵坐标加1后在迷宫内,且当前结点为0,且当前结点没有在栈中出现)
{
当前结点进栈;
把方向j赋予当前结点方向;
find=1;
}break;
case2:
if(横坐标加1后在迷宫内,且当前结点为0,且当前结点没有在栈中出现)
{当前结点进栈;
find=1;
}break;
case3:
if(纵坐标减1后在迷宫内,且当前结点为0,且当前结点没有在栈中出现)
{
case4:
if(横标减1后在迷宫内,且当前结点为0,且当前结点没有在栈中出现)
if(find==1)
{j++;
break;
else方向加1,即换方向;
if(j>
{if(栈顶前一个结点不为空)
{当前结点出栈且方向加1}
elsereturnNULL;
}while(当前结点不是出口)
returntop;
7)voiddisplay(Point*po,Mazea)//输出结果
inti,j,top=0;
Point*stack[maxsize];
if(指针==NULL)
cout<
<
"
没有找到迷宫通路!
endl;
else
{
while(指针!
=NULL)//通过一个栈将链栈逆序
{
stack[top++]=指针;
po指针指向前一个结点;
}
迷宫通道如下:
while(top>
1)将栈中的通路所含结点的方向值加10
top--;
a.maze_array[当前新栈中所存的行坐标][当前新栈中所存的列坐标]=新栈中当前结点到下一个结点的方向+10;
//11、12、13、14分别为东、南、西、北
}
for(i=1;
i<
=行最大值;
i++)//打印迷宫
for(j=1;
j<
=列最大值;
j++)
{
if(结点值<
=1)
cout<
结点值<
"
;
else//根据结点内所存储的方向值,对应输出四个方向的箭头之一,指示从该结点到下一个结点的方向
{
switch(结点值)
{
case东:
输出->
;
break;
case南:
输出↓;
case西:
输出<
-;
case北:
输出↑;
}}}}}
5.调试分析
通过本试验我对链栈有了更深入的了解。
在编写程序的过程中,我们更容易发现问题所在,对算法有更深会的理解。
判断方向的转变使其不会重复走过的路经,这个比较麻烦,当时也不知道如何不让迷宫走“回头路”,只能是查资料,和同学讨论,最终找到了解决办法。
6.使用说明
程序名为:
迷宫.exe,运行环境为DOS。
程序执行后显示
请选择手动或自动生成迷宫
1.手动生成迷宫
2.自动生成迷宫
输入数字选择执行不同的功能。
输入1,使用手动生成迷宫功能;
输入2,使用自动生成迷宫功能;
输入其他数字,则提示输入错误,需要重新输入数字选择功能,直至输入的数字为1或2为止。
输入其他数字后,输出的画面如下:
您输入的数值有误,请重新输入
输入1后,接着输入迷宫的行数和列数,最后出现如下画面
此时请依次输入每个结点的值,其中入口和出口必须输入0:
接着程序会输出迷宫通路或者是没有通路的信息
使用自动创建迷宫功能时,只需输入行数和列数,接着程序会输出迷宫通路或者是没有通路的信息
7.测试结果
1)5X5迷宫,没路的情况,输入和输出如下所示:
2)5X5迷宫,有通路情况,输入和输出如下所示:
3)4X3迷宫,没路情况,输入和输出如下所示:
4)4X3迷宫,有路情况,输入和输出如下所示:
源代码如下:
#include<
iostream>
usingnamespacestd;
#include<
time.h>
stdlib.h>
#definemaxsize20
typedefstruct//定义迷宫结构体
typedefstructpoint//定义迷宫中点的指针的结构体
Mazecreat_manual()//手动创建迷宫
inti,j;
Mazetemp;
cout<
请输入迷宫的行数:
cin>
>
temp.max_x;
请输入迷宫的列数:
temp.max_y;
迷宫的入口和出口已经指定;
迷宫的入口结点坐标为(1,1),输入该结点的值时,请输入0。
迷宫的出口结点坐标为"
("
temp.max_x<
"
temp.max_y<
)"
,输入该结点的值时,请输入0。
结点值为0表示通畅,值为1表示阻隔"
endl<
for(i=1;
=temp.max_x;
i++)
请输入迷宫第"
行各点的值:
for(j=1;
=temp.max_y;
cin>
temp.maze_array[i][j];
returntemp;
Mazecreat_automatic()//自动创建迷宫
unsignedintt;
t=time(NULL)%1000;
srand(t);
//产生随机数种子
temp.maze_array[i][j]=rand()%2;
temp.maze_array[1][1]=0;
//迷宫入口置值为0
temp.maze_array[temp.max_x][temp.max_x]=0;
//迷宫出口置值为0,否则程序不能正常运行
cout<
temp.maze_array[i][j]<
intfound(intx,inty,Point*head)//查找栈中是否有head指针内所含的坐标;
若含,则返回1,否则返回0
Point*p=head;
while(p!
=NULL)
if(x==p->
vex_x&
&
y==p->
vex_y)
return1;
p=p->
ahead;
return0;
Point*find_road(Mazea)//迷宫寻路函数,返回一条通路或者NULL
Point*top,*p;
//top为栈的栈顶指针
intj,find,x,y;
p=(Point*)malloc(sizeof(Point));
p->
ahead=NULL;
vex_x=1;
p->
vex_y=1;
top=p;
j=1;
//j为方向,1、2、3、4分别为东、南、西、北
do
while(j<
=4)
find=0;
//find判断是否为符合条件的结点,若有为1,没有为0
x=p->
vex_x;
y=p->
vex_y;
switch(j)
case1:
if(y+1<
=a.max_x&
!
a.maze_array[x][y+1]&
found(x,y+1,top))
//若纵坐标加1后,在迷宫范围内;
且该结点为0;
且该结点没有在链栈中出现,则当前结点加入链栈
{
p=(Point*)malloc(sizeof(Point));
p->
vex_x=x;
vex_y=y+1;
ahead=top;
top->
direction=j;
//从上一结点至该结点的方向,存放在上一结点的结点指针内
top=p;
find=1;
}break;
case2:
if(x+1<
a.maze_array[x+1][y]&
found(x+1,y,top))
vex_x=x+1;
vex_y=y;
case3:
if(y-1>
=1&
a.maze_array[x][y-1]&
found(x,y-1,top))
vex_y=y-1;
case4:
if(x-1<
a.maze_array[x-1][y]&
found(x-1,y,top))
vex_x=x-1;
if(find==1)//若找到符合条件的结点,则j赋值为1,然后退出内层while循环
{
j=1;
break;
}
else
j++;
//若没有,j加1
if(j>
4)//4个方向都找不到符合条件的结点时
{
if(top->
ahead!
=NULL)//若top不为空,则出栈,上一个结点的方向j加1
p=p->
top=p;
//使栈顶结点指向前一个节点,原节点删除
j=top->
direction+1;
top->
returnNULL;
//若top为空,则返回NULL
}while(top->
vex_x!
=a.max_x||top->
vex_y!
=a.max_y);
//若果当前结点不是出口,则继续进行do-while循环
voiddisplay(Point*po,Mazea)//输出结果
if(po==NULL)
while(po!
stack[top++]=po;
po=po->
1)//出口结点值为0,无方向,不需要把方向赋值给该结点
a.maze_array[stack[top]->
vex_x][stack[top]->
vex_y]=stack[top]->
direction+10;
//把迷宫通路走的方向赋值给迷宫中相应的结点
=a.max_x;
=a.max_y;
if(a.maze_array[i][j]<
a.maze_array[i][j]<
switch(a.maze_array[i][j])
case11:
printf("
%c"
26);
//输出->
break;
case12:
25);
//输出向下的箭头
case13:
27);
//输出<
-
case14:
24);
//输出向上的箭头
}
}
voidmain()
Mazea;
Point*po;
intselection;
请选择手动或自动生成迷宫"
1.手动生成迷宫"
2.自动生成迷宫"
selection;
while(selection!
selection!
=2)
您输入的数值有误,请重新输入"
if(selection==1)
a=creat_manual();
a=creat_automatic();
po=find_road(a);
display(po,a);
getchar();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 迷宫问题实验报告c 编写附源代码汇总 迷宫 问题 实验 报告 编写 源代码 汇总