日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

迷宫搜索问题最短路_迷宫的最短路问题(水+BFS宽搜)

發布時間:2023/12/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 迷宫搜索问题最短路_迷宫的最短路问题(水+BFS宽搜) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

給定一個大小為N*M的迷宮,由通道(‘.’)和墻壁(‘#’)組成,其中通道S表示起點,通道G表示終點,每一步移動可以達到上下左右中不是墻壁的位置。試求出起點到終點的最小步數。(本題假定迷宮是有解的)(N,M<=100)

樣例輸入:

10 10

樣例輸出:

22

BFS里面最經典也是做基礎的問題。

附上AC代碼:

#include

using namespace std;

const int INF=1e6;

const int maxn=100+5;

char c[maxn][maxn];//迷宮的字符串數組

int d[maxn][maxn];//起點到該點的最短路徑

int dx[]={0,1,0,-1},dy[]={1,0,-1,0};//上下左右四個方向

int sx,sy;//起始位置坐標

int gx,gy;//終點位置坐標

typedef pair p;

int N,M;

int bfs()

{

queue

que;

//初始化數組,作標記用

for(int i=0;i

for(int j=0;j

d[i][j]=INF;

que.push(p(sx,sy));//將起點坐標加入隊列,將該點的距離設置為0

d[sx][sy]=0;

//不斷循環隊列直至長度為0

while(que.size())

{

//將隊列最前元素取出

p P=que.front();que.pop();

//如果該點為終止點則結束搜索

if(P.first==gx&&P.second==gy) break;

//四個方向循環

for(int i=0;i<4;i++)

{

//該點坐標設置為(nx,ny)

int nx=dx[i]+P.first;

int ny=dy[i]+P.second;

//判斷該點是否在范圍內并且沒有被訪問過并且是否可以移動

if(nx>=0&&nx=0&&ny

{

//可以移動的話加入隊列并且將該點的距離設置為p點+1

que.push(p(nx,ny));

d[nx][ny]=d[P.first][P.second]+1;

}

}

}

return d[gx][gy];

}

int main()

{

cin>>N>>M;

for(int i=0;i

cin>>c[i];

//找到起點坐標

for(int i=0;i

for(int j=0;j

{

if(c[i][j]=='S')

{

sx=i;sy=j;

break;

}

}

//找到終點坐標

for(int i=0;i

for(int j=0;j

{

if(c[i][j]=='G')

{

gx=i;gy=j;

break;

}

}

int res=bfs();

cout<

return 0;

}

總結

以上是生活随笔為你收集整理的迷宫搜索问题最短路_迷宫的最短路问题(水+BFS宽搜)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。