用BFS解決迷宮問題,BFS解決迷宮問題

來源:互聯網
上載者:User

用BFS解決迷宮問題,BFS解決迷宮問題
在一個n*n的矩陣裡走,從原點(0,0)開始走到終點(n-1,n-1),只能上下左右4個方向走,只能在給定的矩陣裡走,求最短步數。n*n是01矩陣,0代表該格子沒有障礙,為1表示有障礙物。int mazeArr[maxn][maxn]; //表示的是01矩陣int stepArr[4][2] = {{-1,0},{1,0},{0,-1},{0,1}}; //表示上下左右4個方向int visit[maxn][maxn]; //表示該點是否被訪問過,防止回溯,回溯很耗時。解題思路:BFS找出來的是最短路徑,如果用DFS,那麼尋找出來的不是最短路徑。我們先對原點的上下左右進行訪問,如果上下左右的點非障礙物,並且還沒訪問過,那麼就將這些點入隊列,並設定為已經訪問,然後再依次把這些點出隊列,並且重複之前的步驟對這些點的進行上下左右訪問。。。。如果最後訪問到終點(n-1,n-1),則結束代碼如下:

#include<iostream>using namespace std;//定義迷宮的行列#define ROW_COL  4   //定義一個結構體,表示經過的點路徑struct Node{int x;int y;int step;};//賦值Node fuzhi(int x,int y,int step){Node p;p.x=x;p.y=y;p.step=step;return p;}//實現一個迴圈隊列//=====================================#define QueueSize 30typedef struct {Node Seq[QueueSize];int front;int rear;int count;}RQueue;RQueue Q;void Initiate_Queue(RQueue *Q){Q->front=0;Q->rear=0;Q->count=0;}void AppendQueue(RQueue *Q,Node data){if(Q->count>=QueueSize){cout<<"overflow"<<endl;return ;}Q->Seq[Q->rear]=data;Q->rear=(Q->rear+1)%QueueSize;Q->count++;}int QueueNotEmpty(RQueue *Q){if(Q->count!=0)return 1;else return 0;}Node DeleteQueue(RQueue *Q){if(Q->count<=0){cout<<"empty"<<endl;exit(0);}Node d;d=Q->Seq[Q->front];Q->front=(Q->front+1)%QueueSize;Q->count--;return  d;}//=======================//迷宮圖的矩陣int mazeArr[4][4]={{0,0,1,1},{0,1,1,0},{0,0,1,0},{0,1,0,0}};int visit[ROW_COL][ROW_COL];//表示上下左右int stepArr[4][2]={{-1,0},{1,0},{0,-1},{0,1}};//對其進行BFS,找出的路徑為最短路徑,注意二位元組的形參是int (*mazeArr)[4]int BFS(int (*mazeArr)[4],Node node,int n){for(int i=0;i<ROW_COL;i++)for(int j=0;j<ROW_COL;j++)visit[i][j]=0;Node N;Initiate_Queue(&Q);AppendQueue(&Q,node);while(QueueNotEmpty(&Q)){N=DeleteQueue(&Q);if(N.x==n-1 &&N.y==n-1){return N.step;}visit[N.x][N.y]=1;//對該點的上下左右進行遍曆,如果符合條件,就入隊列for(int i=0;i<4;i++){int x=N.x+stepArr[i][0];int y=N.y+stepArr[i][1];if(x>=0 &&y>=0&&x<n&&y<n&&!visit[x][y]&& mazeArr[x][y]==0){visit[x][y]=1;N=fuzhi(x,y,N.step+1);AppendQueue(&Q,N);}}}return -1;}void main(){Node node;node=fuzhi(0,0,0);cout<<BFS(mazeArr,node,ROW_COL);getchar();}




一個C語言廣搜(BFS)解答迷宮問題的例子

請參照我的文件,wenku.baidu.com/...8.html
 
迷宮問題BFS總是逾時

那就雙向BFS吧
雙向BFS可以再提高一點
或者是你的程式出問題了。。。。。
一般BFS過迷宮500內還是沒問題的。。。。。。。。
好好檢查一下把~~
我記得我的從沒那麼長過。。。。
 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.