1 / 7
文档名称:

2.9迷宫问题.doc

格式:doc   大小:198KB   页数:7页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

2.9迷宫问题.doc

上传人:xxq93485240 2019/12/15 文件大小:198 KB

下载得到文件列表

2.9迷宫问题.doc

文档介绍

文档介绍:[问题描述]:以一个m×n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。[实现要求]:⑴实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,d)的形式输出,其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。⑵编写递归形式的算法,求得迷宫中所有可能的通路;⑶以方阵形式输出迷宫及其通路。[测试数据]迷宫的测试数据如下:左上角(1,1)为入口,右下角(8,9)为出口[实现提示]:计算机解迷宫通常用的是“穷举求解”方法,即从入口出发,顺着某一个方向进行探索,若能走通,则继续往前进;否则沿着原路退回,换一个方向继续探索,直至出口位置,求得一条通路。假如所有可能的通路都探索到而未能到达出口,则所设定的迷宫没有通路。可以二维数组存储迷宫数据,通常设定入口点的下标为(1,1),出口点的下标为(m,n)。为处理方便起见,可在迷宫的四周加一圈障碍。对于迷宫中任一位置,均可约定有东、南、西、北四个方向可通。、自定义数据类型structStack//构造栈{ intMaze_x,Maze_y,Maze_z;//定义迷宫X,Y坐标,z方向 Stack*next;//定义栈指针};2、基本操作函数 elseif(a[i+1][j]==0)//判断下边是否可行{ push(i,j,2); i++; a[i][j]=2;//标记走过的位置} elseif(a[i][j-1]==0)//判断左边是否可行{ push(i,j,3); j--; a[i][j]=2;//标记走过的位置} elseif(a[i-1][j]==0)//判断上边是否可行{ push(i,j,4); i--; a[i][j]=2;//标记走过的位置} else//四个方向都不可行,退栈{ inte1,e2; Stack*p;p=ps; ps=ps->next; e1=p->Maze_x; e2=p->Maze_y; a[e1][e2]=3;//标记走过的死胡同坐标 deletep;//删除栈顶元素 i=ps->Maze_x; j=ps->Maze_y; if(ps==NULL)//判断栈空否{ cout<<"nopath!"<<endl; exit(1); } } }#include<iostream>#include<iomanip>usingnamespacestd;Stack*ps;//链头指针voidPop()//出栈函数{ Stack*p;p=ps; ps=ps->next; deletep;}voidpush(intx,inty,intz)//进栈函数{ Stack*t; t=newStack; t->Maze_x=x; t->Maze_y=y; t->Maze_z=z;t->next=ps; ps=t;}voidMazepath(inta[][10],inti,intj)//迷宫路线寻找函数{ a[i][j]=2; intc,d,m=1;//定义变量c,d为出口坐标,变量m作为走过的步数 cout<<"请输入出口坐标:"; cin>>c>>d; while(i!=c||j!=d)//判断是否到达出口 { if(a[i][j+1]=