用棧解決迷宮問題(輸出所有路徑和最短路徑)
阿新 • • 發佈:2018-11-15
#include<iostream> #include<cstdio> using namespace std; #define M 4 //行數 #define N 4 //列數 #define MaxSize 100 //棧最多元素個數 int mg[M+2][N+2]= { {1,1,1,1,1,1} ,{1,0,0,0,1,1} ,{1,0,1,0,0,1} ,{1,0,0,0,1,1} ,{1,1,0,0,0,1} ,{1,1,1,1,1,1} }; struct migong { int i; //路徑橫座標 int j; //路徑縱座標 int di; //方向 } Stack[MaxSize],Path[MaxSize]; //定義棧和存放最短路徑的陣列 int top=-1; //棧頂指標 int count=1; //路徑數計數 int minlen=MaxSize; //最短路徑長度 void mgpath() //路徑為:(1,1)->(M,N) { int i,j,di,find,k; top++; Stack[top].i=1; Stack[top].j=1; Stack[top].di=-1; mg[1][1]=-1; //初始結點進棧 while(top>-1) //棧不空時迴圈 { i=Stack[top].i; j=Stack[top].j; di=Stack[top].di; if(i==M && j==N) //找到了出口,輸出路徑 { cout<<count<<": "; count++; for(k=0; k<=top; k++) { cout<<"("<<Stack[k].i<<","<<Stack[k].j<<")"<<" "; } cout<<endl; if(top+1<minlen) //比較輸出最短路徑 { for(k=0; k<=top; k++) Path[k]=Stack[k]; minlen=top+1; } mg[Stack[top].i][Stack[top].j]=0; //讓該位置變為其他路徑的可走結點 top--; i=Stack[top].i; j=Stack[top].j; di=Stack[top].di; } find=0; while(di<4 && find==0) //找下一個可走結點 { di++; switch(di) { case 0: i=Stack[top].i-1; j=Stack[top].j; break; //上面 case 1: i=Stack[top].i; j=Stack[top].j+1; break; //右邊 case 2: i=Stack[top].i+1; j=Stack[top].j; break; //下面 case 3: i=Stack[top].i; j=Stack[top].j-1; break; //左邊 } if(mg[i][j]==0) find=1; } if(find == 1) //找到了下一個可走結點 { Stack[top].di=di; //修改原棧頂元素的di值 top++; //下一個可走結點進棧 Stack[top].i=i; Stack[top].j=j; Stack[top].di=-1; mg[i][j]=-1; //避免重複走到該結點 } else { mg[Stack[top].i][Stack[top].j]=0; //讓該位置變為其他路徑的可走結點 top--; } } cout<<"最短路徑如下"<<endl; cout<<"長度: "<<minlen<<endl; cout<<"路徑: "<<endl; for(k=0; k<minlen; k++) { cout<<"("<<Path[k].i<<","<<Path[k].j<<")"<<" "; } } int main() { cout<<"迷宮所有路徑如下:"<<endl; mgpath(); return 0; }