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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

BFS入门

發布時間:2023/12/18 编程问答 23 如意码农
生活随笔 收集整理的這篇文章主要介紹了 BFS入门 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
#define MAX 100
#define INF 0x3f3f3f3f
typedef pair<int ,int> P;
int sx,sy,gx,gy,n,m;
char maze[MAX][MAX];
int d[MAX][MAX];
int diraction[][]={{,},{,},{-,},{,-}};
P ser[MAX][MAX];
int bfs()
{
cin>>n>>m;
for(int i=;i<n;i++)
for(int j=;j<m;j++)
{ cin>>maze[i][j];
if(maze[i][j]=='S')
{
sx=i;
sy=j;
}
if(maze[i][j]=='G')
{
gx=i;
gy=j;
}
}
queue<P> que;
que.push(P(sx,sy));
memset(d,INF,sizeof(d));
d[sx][sy]=;
while(que.size())
{
P p=que.front();
que.pop();
int x=p.first,y=p.second;
if(x==gx&&y==gy) break;
for(int i=;i<;i++)
{
int cx=x+diraction[i][],cy=y+diraction[i][];
if(cx>=&&cx<n&cy>=&&cy<m&&d[cx][cy]==INF&&maze[cx][cy]!='#')
{
que.push(P(cx,cy));
d[cx][cy]=d[x][y]+;
ser[cx][cy].first=x;
ser[cx][cy].second=y;
}
}
}
return d[gx][gy];
}
void print(int x,int y)
{
if(x==sx&&y==sy)
{
cout<<'('<<sx<<','<<sy<<')'<<endl;
return ;
}
print(ser[x][y].first,ser[x][y].second);
cout<<'('<<x<<','<<y<<')'<<endl;
return ;
}
int main ()
{
cout<<bfs()<<endl;
print(gx,gy);
return ;
}

樣例:

N=10, M=10(迷宮如下圖所示。'#','.','S','G'分別表示墻壁、通道、起點和終點)
#S######.#
......#..#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.####.###.
....#...G#

輸出
22(附加坐標)

解析  : 廣度優先搜索對樹的每一層一次遍歷,即篩選最短路徑,用隊列存儲找到的元素(相對于深度優先搜索使用棧),其中可用pair類替換結構體;對于打印路徑,因為每個節點的孩子只有一個雙親所以可以用孩子記錄雙親依此找到最短路徑坐標,對于非遞歸輸出可用棧存儲。

總結

以上是生活随笔為你收集整理的BFS入门的全部內容,希望文章能夠幫你解決所遇到的問題。

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