欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    迷宫问题实验报告c++编写附源代码.docx

    • 资源ID:9483659       资源大小:106.56KB        全文页数:22页
    • 资源格式: DOCX        下载积分:3金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    迷宫问题实验报告c++编写附源代码.docx

    1、迷宫问题实验报告c+编写附源代码迷宫问题实验报告 级 班 年 月 日 姓名 学号_ 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概

    3、要设计1)为了实现上述程序功能,需要定义迷宫的抽象数据类型: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_man

    4、ual()初始条件:无 操作结果:手动创建一个迷宫。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()手动创建一个迷

    5、宫 Maze creat_manual();自动创建一个迷宫 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,max_y; /迷宫的行数和和列数Ma

    6、ze;2)定义迷宫中点的指针的结构体typedef struct point int vex_x,vex_y; /结点的横纵坐标(横坐标为行号,纵坐标为列号) struct point *ahead;/在链栈中,指向前一个结点的指针 int direction; /从当前结点走至下一个结点的方向Point;迷宫的基本操作如下3)Maze creat_manual()/手动创建迷宫 输入迷宫的行数和列数;依次输入各点的值;4)Maze creat_automatic()/自动创建迷宫 输入迷宫的行数和列数; 随机产生各点的值; 入口结点和出口结点赋值为0;打印迷宫;5)int found(int

    7、 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(指针=NULL) cout没有找到迷宫

    8、通路!endl; else while(指针!=NULL)/通过一个栈将链栈逆序 stacktop+=指针; po指针指向前一个结点; cout迷宫通道如下:1)将栈中的通路所含结点的方向值加10 top-; 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; case 北: 输

    9、出;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;#includ

    11、e#include# define maxsize 20typedef struct/定义迷宫结构体 int maze_arraymaxsizemaxsize;/二维数组存放迷宫每个点是通畅或阻隔的信息 int max_x,max_y; /迷宫的行数和和列数Maze;typedef struct point/定义迷宫中点的指针的结构体 int vex_x,vex_y; /结点的横纵坐标(横坐标为行号,纵坐标为列号) struct point *ahead;/在链栈中,指向前一个结点的指针 int direction; /从当前结点走至下一个结点的方向Point;Maze creat_manua

    12、l()/手动创建迷宫 int i,j; Maze temp; couttemp.max_x; couttemp.max_y; cout迷宫的入口和出口已经指定;endl; cout迷宫的入口结点坐标为(1,1),输入该结点的值时,请输入0。endl; cout迷宫的出口结点坐标为(temp.max_x,temp.max_y),输入该结点的值时,请输入0。endl; cout结点值为0表示通畅,值为1表示阻隔endlendl; for(i=1;i=temp.max_x;i+) cout请输入迷宫第i行各点的值:; for(j=1;jtemp.maze_arrayij; coutendl; ret

    13、urn temp;Maze creat_automatic()/自动创建迷宫 int i,j; Maze temp; couttemp.max_x; couttemp.max_y; unsigned int t; t=time(NULL)%1000; srand(t);/产生随机数种子 for(i=1;i=temp.max_x;i+) for(j=1;j=temp.max_y;j+) temp.maze_arrayij=rand()%2; temp.maze_array11=0;/迷宫入口置值为0 temp.maze_arraytemp.max_xtemp.max_x=0;/迷宫出口置值为0,

    14、否则程序不能正常运行 for(i=1;i=temp.max_x;i+)/打印迷宫 for(j=1;j=temp.max_y;j+) couttemp.maze_arrayij ; coutendl; coutvex_x&y=p-vex_y) return 1; p=p-ahead; return 0;Point * find_road(Maze a)/迷宫寻路函数,返回一条通路或者NULL Point *top,*p;/top为栈的栈顶指针 int j,find,x,y; p=(Point *)malloc(sizeof(Point); p-ahead=NULL; p-vex_x=1;p-ve

    15、x_y=1; top=p; j=1;/j为方向,1、2、3、4分别为东、南、西、北 do while(jvex_x; y=p-vex_y; switch(j) case 1: if(y+1vex_x=x; p-vex_y=y+1; p-ahead=top; top-direction=j;/从上一结点至该结点的方向,存放在上一结点的结点指针内 top=p; find=1; break; case 2: if(x+1vex_x=x+1; p-vex_y=y; p-ahead=top; top-direction=j; top=p; find=1; break; case 3: if(y-1=1&

    16、!a.maze_arrayxy-1&!found(x,y-1,top) p=(Point *)malloc(sizeof(Point); p-vex_x=x; p-vex_y=y-1; p-ahead=top; top-direction=j; top=p; find=1; break; case 4: if(x-1vex_x=x-1;p-vex_y=y;p-ahead=top; top-direction=j; top=p; find=1; break; if(find=1)/若找到符合条件的结点,则j赋值为1,然后退出内层while循环 j=1; break; else j+; /若没有,

    17、j加1 if(j4)/4个方向都找不到符合条件的结点时 if(top-ahead!=NULL)/若top不为空,则出栈,上一个结点的方向j加1 p=p-ahead; top=p;/使栈顶结点指向前一个节点,原节点删除 j=top-direction+1; top-direction=j; else return NULL;/若top为空,则返回NULL while(top-vex_x!=a.max_x | top-vex_y!=a.max_y);/若果当前结点不是出口,则继续进行do-while循环 return top;void display(Point *po,Maze a)/输出结果

    18、int i,j,top=0; Point *stackmaxsize; if(po=NULL) cout没有找到迷宫通路!ahead; cout迷宫通道如下:1)/出口结点值为0,无方向,不需要把方向赋值给该结点 top-; a.maze_arraystacktop-vex_xstacktop-vex_y=stacktop-direction+10; /把迷宫通路走的方向赋值给迷宫中相应的结点 /11、12、13、14分别为东、南、西、北 for(i=1;i=a.max_x;i+)/打印迷宫 for(j=1;j=a.max_y;j+) if(a.maze_arrayij=1) couta.ma

    19、ze_arrayij break; case 12: printf(%c ,25);/输出向下的箭头 break; case 13: printf(%c ,27);/输出- break; case 14: printf(%c ,24);/输出向上的箭头 break; coutendl; coutendl; void main() Maze a; Point *po; int selection; cout请选择手动或自动生成迷宫endl; cout1.手动生成迷宫endl; cout2.自动生成迷宫selection; while(selection!=1&selection!=2) cout您输入的数值有误,请重新输入endl; cout请选择手动或自动生成迷宫endl; cout1.手动生成迷宫endl; cout2.自动生成迷宫selection; if(selection=1) a=creat_manual(); else a=creat_automatic(); po=find_road(a); display(po,a); getchar(); getchar();


    注意事项

    本文(迷宫问题实验报告c++编写附源代码.docx)为本站会员主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2023 冰点文库 网站版权所有

    经营许可证编号:鄂ICP备19020893号-2


    收起
    展开