1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > BFS(宽度优先搜索 广度优先搜索)

BFS(宽度优先搜索 广度优先搜索)

时间:2024-03-03 11:34:57

相关推荐

BFS(宽度优先搜索 广度优先搜索)

宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。

BFS算法常用于求最短路径或者求扩散性质的区域问题。

(1)走迷宫最短路径

(2)数字按规则转换的最少次数

(3)棋盘上某个棋子N步后能到达的位置总数

(4)病毒扩散计算

(5)图像中连通块的计算。

模板

可以分为四个步骤:初始化(初始化队列和所求的值)-> 判空取队头(判断是否为空并取出队头)-> 拓展(利用队头去扩展)->依次四个方向-> 判断入队(如果符合,将该点入队)。

void bfs(){queue<int>q;//此处定义一个哈希map存距离或者定义全局二维数组存距离q.push(初始位置);//初始位置距离赋值0int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};//四个方向上的向量while(q.size()){auto t = q.front();q.pop();//取出队头的点,用该点向周围扩散。for(int i=0;i<4;i++){int a= ,b= if(check(j)){ //如果该点可行就将它加入队列中q.push(j);//实施相应的操作 }}} }

#include<bits/stdc++.h>using namespace std;const int N=110;typedef pair<int ,int> PII;int n,m;int g[N][N];//存放地图int d[N][N];//存放该点到起点的距离int bfs(){queue<PII> q;memset(d, -1 ,sizeof d);//将值全部初始化为-1 代表还没有走过d[0][0]=0;//第一个点已经走过q.push({0,0});//将起点插入队列中int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};//四个方向上的向量while(q.size()){//判断队列是否为空auto t=q.front();//取出对头元素q.pop();//弹出队头元素for(int i=0;i<4;i++){int x=t.first+dx[i],y=t.second+dy[i];if(x>=0&&x<n&&y>=0&&y<m&&g[x][y]==0&&d[x][y]==-1){//x、y符合条件 该位置为0 且没有走过d[x][y]=d[t.first][t.second]+1;//离起点距离加 1q.push({x,y});//坐标入队}}}return d[n-1][m-1];}int main(){cin>>n>>m;for(int i=0;i<n;i++)for(int j=0;j<m;j++)cin>>g[i][j];cout<<bfs()<<endl;return 0;}

👉解析点这👈

#include<bits/stdc++.h>using namespace std;int bfs(string start) {string end="12345678x";//完成时的字符串queue<string> q;unordered_map<string,int > d; //存放某个字符串到起点的距离q.push(start);//将字符串插入队列d[start]=0;//到起点的距离为0int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};//四个方向上的向量while(q.size()){//对列不为空auto t=q.front();q.pop();//弹出对头int distance=d[t];if(t==end) return distance;//相等则返回距离//一维数组转化为二维数组的技巧int k=t.find('x');//查找x所在的下标int x=k/3,y=k%3;//转化为2维数组时的下标for(int i=0;i<4;i++){int a=x+dx[i],b=y+dy[i];if(a>=0&&a<3&&b>=0&&b<3){//如果a,b没有越界swap(t[k],t[a*3+b]);//把x和要走的位置 互换一下if(!d.count(t)){//如果当前位置没有走过 每次四个方向判断完后都被弹出了 下次再走时已经不存在d[t]=distance+1;q.push(t);}swap(t[k],t[a*3+b]);//把位置还原 继续判断下一个方向}}}return -1;}int main() {char c;string start;for(int i=0; i<9; i++) {cin>>c;start+=c;//字符的拼接}cout<<bfs(start)<<endl;return 0;}

套模板是如此的简单 直接上代码

#include<bits/stdc++.h>using namespace std;const int N=110;typedef pair<int,int> PII;int g[N][N];int d[N][N];int n,m;int x3,y3,x2,y2;//y0,y1与math头文件有冲突 不能用int bfs(int x3,int y3,int x2,int y2){bool st=false;memset(d,-1,sizeof(d));d[x3][y3]=0;queue<PII> q;q.push({x3,y3});while(q.size()){auto t=q.front();if(t.first==x2&&t.second==y2) st=true;q.pop();int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};for(int i=0;i<4;i++){int x=t.first+dx[i],y=t.second+dy[i];if(x>=1&&x<=n&&y>=1&&y<=m&&d[x][y]==-1&&g[x][y]==1){d[x][y]=d[t.first][t.second]+1;q.push({x,y});}}}if(st) return d[x2][y2];return -1;}int main(){cin>>n>>m;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>g[i][j];cin>>x3>>y3>>x2>>y2;cout<<bfs(x3,y3,x2,y2)<<endl;}

也可以说是bfs吧

#include<bits/stdc++.h>using namespace std;const int N=1010;char a[N][N];char b[N][N];int n,m,k;void bfs(){for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)b[i][j]=a[i][j];for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(b[i][j]=='g'){if(i-1>=1)a[i-1][j]='g';if(i+1<=n)a[i+1][j]='g';if(j-1>=1)a[i][j-1]='g';if(j+1<=m)a[i][j+1]='g';}}}}int main(){cin>>n>>m;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>a[i][j];cin>>k;while(k--){bfs();}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cout<<a[i][j];}cout<<endl;}return 0;}

#include<bits/stdc++.h>using namespace std;string start,ed;int len;int bfs(){unordered_map <string,int>dist;dist[start] = 0;queue<string> q;q.push(start);while(q.size()){auto t = q.front();q.pop();int distance = dist[t];if(t==ed) return distance;int dx[6] = {1,-1,2,-2,3,-3};int k = t.find('*');for(int i = 0;i < 6;i++){int x = k + dx[i];if(x >= 0 && x < len){swap(t[k],t[x]);if(!dist.count(t)){dist[t] = distance + 1;q.push(t);}swap(t[k],t[x]);}}}return -1;}int main(){cin>>start>>ed;len=start.size();cout << bfs() << endl;return 0;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。