1.找出一条迷宫通路
//迷宫求解。 #include"stdlib.h" #include"stdio.h" #include<stack> #include<iostream> using namespace std; typedef struct Pseat{ int x; int y; bool operator==(Pseat& rhs) { return x==rhs.x&&y==rhs.y; } //操作符重载 }; typedef struct{ Pseat seat; //通道块在迷宫中的位置 int di; //下一通道块的方向 }ElemType; Pseat findNextSeat(Pseat cur,int di) //结构体是可以直接返回的? { Pseat nextSeat; if(di==1) { nextSeat.x=cur.x+1; nextSeat.y=cur.y; } else if(di==2) { nextSeat.x=cur.x; nextSeat.y=cur.y+1; } else if(di==3) { nextSeat.x=cur.x-1; nextSeat.y=cur.y; } else if(di==4) { nextSeat.x=cur.x; nextSeat.y=cur.y-1; } return nextSeat; } //只找出了其中的一条路 stack<ElemType> findPath(int migong[][10],Pseat start,Pseat end) //栈可以返回 { ElemType *current; stack<ElemType> path; Pseat curpos=start; //当前路径。注意结构体初始化的方法 do { if(migong[curpos.x][curpos.y]==0) //当前位置为迷宫墙壁则为-1,当前位置可通则为0,当前位置已经走过则为1,当前位置不通则为2 { migong[curpos.x][curpos.y]=1; //留下足迹,走过的位置置1 current=new ElemType(); current->di=1; current->seat.x=curpos.x; current->seat.y=curpos.y; path.push(*current); //加入路径 if(curpos==end) //为出口,则结束.注意,在这里curpos==end是错的 return path; else //否则切换到该点的东邻为下一个点 { curpos=findNextSeat(curpos,1); } } else { current=&path.top(); if(current->di==4) //如果当前位置不通,并且栈顶块的4个方向都探索完,则弹出栈顶元素 { migong[current->seat.x][current->seat.y]=2; //留下不能通过的足迹 path.pop(); } else //否则就换一个方向探索 { (current->di)++; curpos=findNextSeat(current->seat,current->di); } } } while (!path.empty()); return path; } void main() { int migong[][10]={{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},{-1,0,0,-1,0,0,0,-1,0,-1},{-1,0,0,-1,0,0,0,-1,0,-1},{-1,0,0,0,0,-1,-1,0,0,-1},{-1,0,-1,-1,-1,0,0,0,0,-1},{-1,0,0,0,-1,0,0,0,0,-1},{-1,0,-1,0,0,0,-1,0,0,-1},{-1,0,-1,-1,-1,0,-1,-1,0,-1},{-1,-1,0,0,0,0,0,0,0,-1},{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}}; Pseat start={1,1}; Pseat end={8,8}; stack<ElemType> path=findPath(migong,start,end); while(!path.empty()) { cout<<path.top().seat.x<<","<<path.top().seat.y<<endl; path.pop(); } }
2.找出所有的迷宫通路
时间: 2024-12-16 02:58:47