迷宮最短路徑問題(BFS)
阿新 • • 發佈:2019-02-10
別人部落格上看到的一道題:給定一個大小為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;
}