1. 程式人生 > >迷宮最短路徑問題(BFS)

迷宮最短路徑問題(BFS)

別人部落格上看到的一道題:給定一個大小為N*M的迷宮,由通道(‘.’)和牆壁(‘#’)組成,其中通道S表示起點,通道G表示終點,每一步移動可以達到上下左右中不是牆壁的位置。試求出起點到終點的最小步數。(本題假定迷宮是有解的)(N,M<=100)
原地址:http://blog.csdn.net/lrgdongnan/article/details/51773728

比較基礎的迷宮題,用BFS演算法即可,以下自己寫的程式碼:
寫學霸的迷宮那道題時發現二維陣列[i][j]和座標(x,y)是相反的,如果迷宮不是正方形就會出錯了….陣列[i][j]中i應該對應座標y,j對應座標x,修改了一下程式碼重新放上來,這次應該沒問題了- -。搜尋函式還是應該跟主函式獨立出來的,寫到一起了看著好亂-_-||

#include <iostream>
#include <string.h>
#include <queue>
using namespace std;
struct mig{
    int tep;
    int x,y;
    char s;
}mg[100][100];
int main()
{
    bool f[100][100];
    memset(f,0,sizeof(f));
    queue<mig> myq;
    mig tt,cc;
    int n,m,i,j,suf;                  //suf走出迷宮成功標記
cin>>n>>m; for(i=0;i<n;i++) for(j=0;j<m;j++){ cin>>mg[i][j].s; mg[i][j].y=i; mg[i][j].x=j; //注意二維陣列的[i][j]與座標(x,y)相反 if(mg[i][j].s=='S') { mg[i][j].tep=0; f[i][j]=1; myq.push(mg[i][j]);} if(mg[i][j].s=='#'
) f[i][j]=1; } while(!myq.empty()) { tt=myq.front(); myq.pop(); i=tt.y; j=tt.x; if(i+1<n && f[i+1][j]==0) { if(mg[i+1][j].s=='G'){suf=1; break;} //向下 f[i+1][j]=1; cc.y=i+1; cc.x=j; cc.tep=tt.tep+1; myq.push(cc); } if(i-1>=0 && f[i-1][j]==0) { if(mg[i-1][j].s=='G'){suf=1; break;} //向上 f[i-1][j]=1; cc.y=i-1; cc.x=j; cc.tep=tt.tep+1; myq.push(cc); } if(j+1<m && f[i][j+1]==0) { if(mg[i][j+1].s=='G'){suf=1; break;} //向右 f[i][j+1]=1; cc.y=i; cc.x=j+1; cc.tep=tt.tep+1; myq.push(cc); } if(j-1>=0 && f[i][j-1]==0) { if(mg[i][j-1].s=='G'){suf=1; break;} //向左 f[i][j-1]=1; cc.y=i; cc.x=j-1; cc.tep=tt.tep+1; myq.push(cc); } } if(suf==1) cout<<tt.tep+1<<endl; else cout<<"no"<<endl; return 0; }