迷宮問題BFS
阿新 • • 發佈:2019-02-03
相信大家在學習資料結構時都會遇到一個問題,即迷宮問題。一般來說大家都會像真實走迷宮一樣進行DFS搜尋,但我今天給出的是隨機生成迷宮且找最短路徑的程式碼。通過這一次的程式設計,我發現自己要注意以下兩點:1.要注意程式執行過程中的變數改變;2.對於複雜的條件判斷,需要細心。
Have fun coding,i_human.Have fun coding,everyone!
THE CODE:
// 資料結構迷宮.cpp : 定義控制檯應用程式的入口點。 // #include "stdafx.h" #include <cstdlib> #include<iostream> #include<queue> #include<ctime> #define N 4 //定義迷宮為4*4 using namespace std; struct pot //為記錄路徑的rec[]準備,座標(x,y) { int x; int y; inline bool operator ==(const pot a) { return x==a.x && y==a.y; } }; class maze { public: maze(); bool find(); void print(); void path(); ~maze(){}; private: void create(); void clearrec(); int pic[N+2][N+2]; //迷宮本身 pot rec[N+1][N+1]; //BFS過程中記錄路徑 }; maze::maze() { create(); clearrec(); } bool maze::find() //使用BFS尋求最短路徑 { pot n;n.x=n.y=0; queue<pot>qu; pot tmp;tmp.x=tmp.y=1; qu.push(tmp); while(!qu.empty()) { if(pic[qu.front().x][qu.front().y-1]!=1 && rec[qu.front().x][qu.front().y-1]==n) { tmp.x=qu.front().x;tmp.y=qu.front().y-1; qu.push(tmp); tmp.y++; rec[qu.front().x][qu.front().y-1]=tmp; if(pic[qu.front().x][qu.front().y-1]==3) return true; } if(pic[qu.front().x+1][qu.front().y]!=1 && rec[qu.front().x+1][qu.front().y]==n) { tmp.x=qu.front().x+1;tmp.y=qu.front().y; qu.push(tmp); tmp.x--; rec[qu.front().x+1][qu.front().y]=tmp; if(pic[qu.front().x+1][qu.front().y]==3) return true; } if(pic[qu.front().x][qu.front().y+1]!=1 && rec[qu.front().x][qu.front().y+1]==n) { tmp.x=qu.front().x;tmp.y=qu.front().y+1; qu.push(tmp); tmp.y--; rec[qu.front().x][qu.front().y+1]=tmp; if(pic[qu.front().x][qu.front().y+1]==3) return true; } if(pic[qu.front().x-1][qu.front().y]!=1 && rec[qu.front().x-1][qu.front().y]==n) { tmp.x=qu.front().x-1;tmp.y=qu.front().y; qu.push(tmp); tmp.x++; rec[qu.front().x-1][qu.front().y]=tmp; if(pic[qu.front().x-1][qu.front().y]==3) return true; } qu.pop(); } return false; } void maze::path() { int a=N,b=N; while(pic[a][b]!=2) { cout<<"("<<a<<","<<b<<")"<<"<--"; int c=a; a=rec[a][b].x; b=rec[c][b].y; } cout<<"(1,1)"<<endl; } void maze::print() //打印出隨機生成的迷宮 { for(int i=0;i<N+2;i++) { for(int j=0;j<N+2;j++) cout<<pic[i][j]<<" "; cout<<endl; } } void maze::create() //隨機生成迷宮,每次以左上為起點,右下為終點 { for(int i=0;i<N+2;i++) pic[0][i]=pic[N+1][i]=1; for(int i=1;i<N+1;i++) pic[i][0]=pic[i][N+1]=1; srand((unsigned)time(NULL)); for(int i=1;i<N+1;i++) for(int j=1;j<N+1;j++) pic[i][j]=rand()%2; pic[1][1]=2; pic[N][N]=3; } void maze::clearrec() //初始化路徑記錄器 { for(int i=1;i<=N;i++) for(int j=1;j<=N;j++) rec[i][j].x=rec[i][j].y=0; rec[1][1].x=rec[1][1].y=N; //防止回到起點的無用操作 } int main() { maze example; example.print(); if(example.find()) example.path(); else cout<<"the solution can not be found."<<endl; system("pause"); return 0; }