数据结构课程设计迷宫问题

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构课程设计迷宫

问题

Document number【SA80SAB-SAA9SYT-SAATC-SA6UT-SA18】

数据结构课程设计课程名称:数据结构

题目:迷宫设计

系别:软件学院

专业:移动设备应用开发

班级:15级移动1班

姓名:黄国峰

学期:2016-2017第一学期

指导教师:李博

时间:2016年12月

目录

第一部分需求分析

第二部分详细设计

第三部分调试分析

第四部分用户手册

第五部分测试结果

第六部分附录

第七部分参考文献

一、需求分析

1、对于给定的一个迷宫,给出一个出口和入口,找一条从入口到出口的通路,并把这条通路显示出来;如果没有找到这样的通路给出没有这样通路的信息。

2、可以用一个m×n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。

3、编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,d)的形式输出,其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。

4、手动设置迷宫是任意给定的,所以程序要能够对给定的迷宫生成对应的矩阵表示,所以程序的输入包括了矩阵的行数、列数、迷宫内墙的个数、迷宫内墙的坐标、所求的通路的入口坐标、出口坐标。

5、自动生成的迷宫原理很简单,因为0和1分别代表通道和障碍物,所以只需要随机生成0和1然后再给最外围都赋值为1,就形成了新的迷宫。

二、详细设计

1、计算机解迷宫通常用的是“穷举求解“方法,即从人口出发,顺着某一个方向进行探索,若能走通,则继续往前进;否则沿着原路退回,换一个方向继续探索,直至出口位置,求得一条通路。假如所有可能的通路都探索到而未能到达出口,则所设定的迷宫没有通路。

可以二维数组存储迷宫数据,通常设定入口点的下标为(1,1),出口点的下标为(n,n)。为处理方便起见,可在迷宫的四周加一圈障碍。对于迷宫中任一位置,均可约定有东、南、西、北四个方向可通。

2、如果在某个位置上四个方向都走不通的话,就退回到前一个位置,换一个方向再试,如果这个位置已经没有方向可试了就再退一步,如果所有已经走过的位置的四个方向都试探过了,一直退到起始点都没有走通,那就说明这个迷宫根本不通。

3、所谓"走不通"不单是指遇到"墙挡路",还有"已经走过的路不能重复走第二次",它包括"曾经走过而没有走通的路"。

显然为了保证在任何位置上都能沿原路退回,需要用一个"后进先出"的结构即栈来保存从入口到当前位置的路径。并且在走出出口之后,栈中保存的正是一条从入口到出口的路径。

4、若当前位置“可通”,则纳入“当前路径”,并继续朝“下一位置”探索;若当前位置“不可通”,则应顺着“来的方向”退回到“前一通道块”,然后朝着除“来向”之外的其他方向继续探索;若该通道块的四周四个方块均“不可通”,则应从“当前路径”上删除该通道块。

所谓“下一位置”指的是“当前位置”四周四个方向(东、南、西、北)上相邻的方块。假设以栈S记录“当前路径”,则栈顶中存放的是“当前路径上最后一个通道块”。由此,“纳入路径”的操作即为“当前位置入栈”;“从当前路径上删除前一通道块”的操作即为“出栈”。

5、找通路的程序的关键部分可以表示如下:

do{

若当前位置可通,

则{

将当前位置插入栈顶;

PosType seat; 。{

m[][]=curstep;

}

PosType NextPos(PosType c,int di);

+=direc[di].y;

return c;

}

void MarkPrint(PosType a)动输入。*****************\n");

printf("*****************2.自动生成。*****************\n");

printf("*****************3.退出。*****************\n");

printf("请输入:");

scanf("%d",&n);

system("CLS");

switch(n)

{

case 1:

printf("请输入迷宫的宽和长:");

scanf("%d%d",&x,&y);

GenerateMaze(x,y);

printf("请输入起点的坐标:"); scanf("%d%d",&,&;

printf("请输入终点的坐标:"); scanf("%d%d",&,&;

MazePathway(begin,end,x,y);

break;

case 2:

printf("请输入迷宫的宽和长:"); scanf("%d%d",&x,&y);

Auto_maze(x,y);

for(i=0;i

{

m[0][i]=1;

m[x-1][i]=1;

}

for(j=0;j

{

m[j][0]=1;

m[j][y-1]=1;

}

Print(x,y);

printf("请输入起点的坐标:"); scanf("%d%d",&,&;

printf("请输入终点的坐标:"); scanf("%d%d",&,&;

MazePathway(begin,end,x,y);

break;

case 3: exit(-1);

}

}

return 0;

}

相关文档
最新文档