【DFS】 用 棧 求迷宮問題的所有路徑和最短路徑
阿新 • • 發佈:2018-11-09
1++.cpp
方法來源 https://blog.csdn.net/zhouchenghao123/article/details/83626222
博主 :ZAX1 ,部落格:用棧解決迷宮問題(輸出所有路徑和最短路徑)
//【DFS】 用 棧 求迷宮問題的所有路徑和最短路徑 #include <iostream> #include <cstdio> #include <cstdlib> using namespace std; #define M 4//迷宮大小和出口位置 #define N 4 #define MaxSize 100//規定棧空間最大是100 int mg[M+2][N+2]={// 1 障礙,0 可走點,-1已走過點 {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(){ int i,j,di,find,k;// i,j表示當前位置,di為方向,find為是否找到了可走點,找到為1,k讀取用 top++; Stack[top].i=1; //初始位置(1,1) Stack[top].j=1; Stack[top].di=-1; mg[1][1]=-1; while(top>-1){ //只要棧Stack不為空就繼續走 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;/* 因為top從0開始,minlen=count從1開始,給top+1 */ 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;/* 0 0123上右下左四個方向走,找可走點 3 1 2 */ while(di<4 && find==0){ //在4個方向內,尋找可走點 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; }
歐克。