《迷宫问题实验报告c编写附源代码》由会员分享,可在线阅读,更多相关《迷宫问题实验报告c编写附源代码(18页珍藏版)》请在金锄头文库上搜索。
1、迷宫问题实验报告 级 班 年 月 日 姓名 学号_ 1实验题目以一个mXn的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。2需求分析本程序使用VC编写,实现设定迷宫或自动生成迷宫长方阵表的功能,并且求出一条从指定入口到指定出口的通路,或得出没有通路的结论。 输入的形式和输入值的范围: A.输入指定的数字,以此选择迷宫的创建方式,分为手动创建迷宫和自动创建迷宫B. 输入迷宫阵表的行数和列数,行数和列数不超过40行C. 手动创建迷宫时,需要输入迷宫结点的通畅和障碍情况,0和1分别表示迷宫中的通路和障碍。 输出的形
2、式:输出没有通路的结论,或者输出一个长方阵表,其中路径的每个结点都输出、之一,表示从当前结点到下一个结点的方向。 程序所能达到的功能:实现设定迷宫或自动生成迷宫长方阵表的功能,并且求出一条从指定入口到指定出口的通路(迷宫的入口指定为坐标为(1,1)的结点,迷宫的出口指定为坐标为(迷宫最大行,迷宫最大列)的结点),或得出没有通路的结论。 测试数据:输入数据:A 出现选择生成迷宫方式的菜单时,输入1(即手动输入数据,生成迷宫);B 输入迷宫的行数和列数,行数输入3,列数输入3;C 输入每个迷宫结点的信息:0 0 11 0 01 0 0输出结果: 11 1 0 03概要设计1) 为了实现上述程序功能
3、,需要定义迷宫的抽象数据类型:typedef struct/定义迷宫结构体int maze_arraymaxsizemaxsize;/二维数组存放迷宫每个点是通畅或阻隔的信息int max_x,max_y; /迷宫的行数和和列数2) 定义迷宫中点的指针的结构体typedef struct point int vex_x,vex_y; /结点的横纵坐标(横坐标为行号,纵坐标为列号)struct point *ahead;/在链栈中,指向前一个结点的指针int direction; /从当前结点走至下一个结点的方向;基本操作: A. Maze creat_manual()初始条件:无 操作结果:手
4、动创建一个迷宫。B. Maze creat_automatic()初始条件:无操作结果:自动创建一个迷宫。C. int found(int x,int y,Point *head)初始条件:存在一个存放结点的链栈操作结果:查找栈中是否有head指针内所含的坐标;若含,则返回1,否则返回0。D. Point * find_road(Maze a)初始条件:存在一个迷宫操作结果:返回一条通路或者NULL E. void display(Point *po,Maze a) 初始条件:存在一个迷宫操作结果:输出结果。程序包含6个函数:主函数main()手动创建一个迷宫 Maze creat_manua
5、l();自动创建一个迷宫 Maze creat_automatic();查找栈中是否有head指针内所含的坐标 int found(int x,int y,Point *head);迷宫寻路函数 Point * find_road(Maze a);显示迷宫信息函数 void display(Point *po,Maze a);各函数间关系如下:主函数创建迷宫迷宫求解函数改变条件输出路径初始化符和条件?进栈找到出口?4详细设计1) 定义迷宫结构体typedef struct int maze_arraymaxsizemaxsize;/二维数组存放迷宫每个点是通畅或阻隔的信息int max_x,m
6、ax_y; /迷宫的行数和和列数Maze;2) 定义迷宫中点的指针的结构体typedef struct point int vex_x,vex_y; /结点的横纵坐标(横坐标为行号,纵坐标为列号)struct point *ahead;/在链栈中,指向前一个结点的指针int direction; /从当前结点走至下一个结点的方向Point;迷宫的基本操作如下3) Maze creat_manual()/手动创建迷宫输入迷宫的行数和列数;依次输入各点的值;4) Maze creat_automatic()/自动创建迷宫 输入迷宫的行数和列数; 随机产生各点的值; 入口结点和出口结点赋值为0;打印
7、迷宫;5) int found(int x,int y,Point *head) 查找栈中是否有head指针内所含的坐标 若含,则返回1;否则返回06) Point * find_road(Maze a)/迷宫寻路函数,返回一条通路或者NULL int j,find,x,y;do while(方向j4) if(栈顶前一个结点不为空) 当前结点出栈且方向加1else return NULL;while(当前结点不是出口) return top;7) void display(Point *po,Maze a)/输出结果int i,j,top=0;Point *stackmaxsize;if(指针
8、=NULL)cout没有找到迷宫通路!endl;elsewhile(指针!=NULL)/通过一个栈将链栈逆序stacktop+=指针;po指针指向前一个结点;cout迷宫通道如下:1)将栈中的通路所含结点的方向值加10top-;a.maze_array当前新栈中所存的行坐标当前新栈中所存的列坐标=新栈中当前结点到下一个结点的方向+10;/11、12、13、14分别为东、南、西、北 for(i=1;i=行最大值;i+)/打印迷宫 for(j=1;j=列最大值;j+)if(结点值=1)cout结点值; break; case 南: 输出;break; case 西: 输出- ;break; cas
9、e 北: 输出;break; 5调试分析通过本试验我对链栈有了更深入的了解。在编写程序的过程中,我们更容易发现问题所在,对算法有更深会的理解。判断方向的转变使其不会重复走过的路经,这个比较麻烦,当时也不知道如何不让迷宫走“回头路”,只能是查资料,和同学讨论,最终找到了解决办法。6使用说明程序名为:迷宫.exe,运行环境为DOS。程序执行后显示请选择手动或自动生成迷宫1.手动生成迷宫2.自动生成迷宫输入数字选择执行不同的功能。输入1,使用手动生成迷宫功能;输入2,使用自动生成迷宫功能;输入其他数字,则提示输入错误,需要重新输入数字选择功能,直至输入的数字为1或2为止。输入其他数字后,输出的画面如
10、下:您输入的数值有误,请重新输入请选择手动或自动生成迷宫1.手动生成迷宫2.自动生成迷宫输入1后,接着输入迷宫的行数和列数,最后出现如下画面此时请依次输入每个结点的值,其中入口和出口必须输入0:接着程序会输出迷宫通路或者是没有通路的信息使用自动创建迷宫功能时,只需输入行数和列数,接着程序会输出迷宫通路或者是没有通路的信息7测试结果1) 5X5迷宫,没路的情况,输入和输出如下所示:2) 5X5迷宫,有通路情况,输入和输出如下所示:3) 4X3迷宫,没路情况,输入和输出如下所示: 4) 4X3迷宫,有路情况,输入和输出如下所示:源代码如下:# include using namespace std;#include#include# define maxsize 20typedef struct/定义迷宫结构体int maze_arraymaxsizemaxsize;/二维数组存放迷宫每个点是通畅或阻隔的信息int max_x,max_y; /迷宫的行数和和列数Maze;typedef struct point/定义迷宫