1、(i,j)指示迷宫中的一个坐标,di表示走到下一坐标的方向,di的取值为0、1、2、3分别表示北、东、南、西。(3)若设定的迷宫存在通路,则以方阵形式将迷宫及其通路输出到标准输出文件上,对于迷宫中的每个方块,有上下左右4个方块相邻,第i行第j列的当前方块的位置记为(i,j),规定上方方块为方位0,并按顺时针方向递增编号。在试探过程中,假设按从方位0到方位3的顺序查找下一个可走的方块。(4)先将入口进栈(其初始方位设置为-1),在栈不空时循环:取栈顶方块(不退栈),若该方块是出口,则输出栈中所有方块即为路径,否则,找下一个可走的相邻方块,若不存在这样的方块,说明当前路径不可能走通,则回溯。也就是
2、恢复当前方块为0后退栈;若存在这样的方块,则将这个可走的相邻方块进栈(其初始方位设置为-1)。3算法的设计3.1 定义坐标(X,Y)#includefstreamusing namespace std;struct Coor int row; int column; int direction;3.2 定义方向struct Move 3.3 定义/链表结点struct LinkNode Coor data; LinkNode *next;3.4 定义栈class stackprivate: LinkNode *top;public: stack(); stack(); void Push(Co
3、or data); Coor Pop(); Coor GetPop(); void Clear(); bool IsEmpty();3.5 定义迷宫定义移动的4个方向Move move4=0,1,1,0,0,-1,-1,0;6、几个函数功能的描述: /构造函数,置空栈 /析构函数 /把元素data压入栈中 /使栈顶元素出栈 /取出栈顶元素 /把栈清空 /判断栈是否为空bool Mazepath(int *maze,int m,int n); /寻找迷宫maze中从(0,0)到(m,n)的路径 /到则返回true,否则返回falsevoid PrintPath(stack p); /输出迷宫的路
4、径void PrintPath2(int m,int n,stack p,int *maze); /输出路径void Restore(int *maze,int m,int n); /恢复迷4各模块的伪码算法4.1 根据输入产生一个8*8的迷宫m=a; n=b; maze=new int *m+2; /申请长度等于行数加2的二级指针 for(i= 0;im+2;i+) /申请每个二维指针的空间 mazei=new intn+2; for(i=1;=m;i+) for(j=1;jmazeij; cout是否保存新迷宫?n;用Y或y表示保存、N或n表示不保存 n char choose;choos
5、e; if(choose=Y|choose=y) char ch; ofstream fop(Newtest.txt); for(i=1;i+) for(j=1; ch=0+mazeij; fopch; fopendl; flush(cout); fop.close(); /给迷宫的四周加一堵墙,即把迷宫四周定义为1 for(i=0; mazei0=mazein+1=1;n+2; maze0i=mazem+1i=1; for(int p=0;p+p) for(int q=0;q=n+2;+q) if(mazepq=0) cout=1) cout return maze; /返回存贮迷宫的二维指
6、针maze4.2 探索路径函数bool Mazepath(int *maze,int m,int n) stack q,p; /定义栈p、q,分别存探索迷宫的存储和路径过程 Coor Temp1,Temp2; int row,column,loop; Temp1.row=1; Temp1.column=1; q.Push(Temp1); /将入口位置入栈 p.Push(Temp1); maze11=8; /标志入口位置已到达过 while(!q.IsEmpty() /栈q非空,则反复探索 Temp2=q.GetPop(); /获取栈顶元素 if(!(p.GetPop().row=q.GetPo
7、p().row&p.GetPop().column=q.GetPop().column) p.Push(Temp2); /如果有新位置入栈,则把上一个探索的位置存入栈p for(loop=0;loop4;loop+) /探索当前位置的4个相邻位置 row=Temp2.row+moveloop.row; /计算出新位置x位置值 column=Temp2.column+moveloop.column; /计算出新位置y位置值 if(mazerowcolumn=0) /判断新位置是否可达 Temp1.row=row; Temp1.column=column; mazerowcolumn=8; /标志
8、新位置已到达过 q.Push(Temp1); /新位置入栈 if(row=(m)&(column=(n) /成功到达出口 Temp1.row=m; Temp1.column=n; Temp1.direction=0; p.Push(Temp1); /把最后一个位置入栈 char choose; cout if(choose=1) PrintPath(p); /坐标显示输出 Restore(maze,m,n); else PrintPath2(m,n,p,maze); /矩阵显示输出 return 1; /表示成功找到路径 if(p.GetPop().row=q.GetPop().row&p.G
9、etPop().column=q.GetPop().column) /如果没有新位置入栈,则返回到上一个位置 p.Pop(); q.Pop(); return 0; /表示查找失败,即迷宫无路经4.3 输出迷宫void PrintPath(stack p) /输出路径迷宫的路径为n括号内的内容分别表示为(行坐标,列坐标,数字化方向,方向)n stack t; /定义一个栈,按从入口到出口存取路径 int a,b; LinkNode *temp; temp=new LinkNode; /申请空间 temp-data=p.Pop(); /取栈p的顶点元素,即第一个位置 t.Push(temp-da
10、ta); /第一个位置入栈t delete temp; /释放空间p.IsEmpty() /栈p非空,则反复转移 temp=new LinkNode; temp- /获取下一个位置 /得到行走方向 a=t.GetPop().row-temp-data.row; /行坐标方向 b=t.GetPop().column-temp-data.column; /列坐标方向 if(a=1) temp-data.direction=1; /方向向下,用1表示 else if(b=1) temp-data.direction=2; /方向向右,用2表示 else if(a=-1) temp-data.dire
11、ction=3; /方向向上,用3表示 else if(b=-1) temp-data.direction=4; /方向向左,用4表示 t.Push(temp- /把新位置入栈 delete temp;坐标(row,column,direction)中x在指向当前位置所在的行数,y指向当前位置所在的列数,direction表示下一位置走向。 /输出路径,包括行坐标,列坐标,下一个位置方向t.IsEmpty() /栈非空,继续输出 data=t.Pop();(data.row,data.columndata.direction, /输出行坐标,列坐标 switch(data.direction)
12、 /输出相应的方向 case 1:cout)nbreak; case 2:)n case 3:)n case 4:)n case 0:)nvoid PrintPath2(int m,int n,stack p,int *maze) /输出路径 for (int i = 0; i m+2; +i ) for (int j = 0; j n+2; +j) cout mazeij cout data=x;next=top; top=TempNode;Coor stack:Pop() /使栈顶元素出栈 Coor Temp; TempNode=top; top=top-next; Temp=TempNo
13、de-data; delete TempNode; return Temp;GetPop() /取出栈顶元素 return top-Clear() /把栈清空bool stack:IsEmpty() if(top=NULL) return true; else return false; /定义移动的4个方向 /恢复迷宫int* GetMaze(int &m,int &n); /获取迷宫(可从文件中读取,也可输入) /返回存取迷宫的二维指针int main() system(color f5 int m=0,n=0; int *maze; /定义二维指针存取迷宫 cout ntt*欢迎使用迷宫模拟程序* tt 14级计算机物联网班 tt 鲁向阳 肖吟月 tt 学号:14450139 14450132 maze=GetMaze(m,n); /调用GetMaze(int &n)函数,得到迷宫 if(Mazepath(maze,m,n) /调用Mazepath(int *maze,int m,int n)函数获取路径迷宫路径探索成功! else cout=ch mazeij=ch- /把数字字符转化为数字,并存到指针里mazeijb;请输入迷宫内容:(0表示通路,1表示不连通。中间用空格键分开)n m=a; maze=new
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1