BFS 算法
Posted changfan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BFS 算法相关的知识,希望对你有一定的参考价值。
一:BFS概念
宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。
所谓广度,就是一层一层的,向下遍历,层层堵截,还是这幅图,我们如果要是广度优先遍历的话,我们的结果是V1 V2 V3 V4 V5 V6 V7 V8。
1、访问顶点vi ;
2、访问vi 的所有未被访问的邻接点w1 ,w2 , …wk ;
3、依次从这些邻接点(在步骤②中访问的顶点)出发,访问它们的所有未被访问的邻接点; 依此类推,直到图中所有访问过的顶点的邻接点都被访问;
问题实例:
#include<stdio.h> struct note int x; //x坐标 int y; //y坐标 int f; //队列标号 int s; //步数 ; int main() struct note que[2501]; //地图大小不会超过50*50 int book[51][510]=0; //记录步数,防止一个点被重复走 int a[51][51]=0; //用来存储步数 //定义一个走的数组 int next[4][2]= 0,1,//右走 1,0,//左走 0,-1,//上走 -1,0, //下走 ; int startx,starty,q,p,i,j,k,head,tail,tx,ty; //起点坐标 终点横纵坐标 int n,m; //迷宫的纵横数 int flag; scanf("%d %d",&n,&m); //输入棋谱 for(i=1;i<=n;i++) for(j=1;j<=m;j++) scanf("%d",&a[i][j]); //输入起始坐标和终点坐标 scanf("%d %d %d %d",&startx,&starty,&p,&q); //队列的初始化 head = 1; tail = 1; //往队列中插入入口坐标 que[tail].x = startx; que[tail].y = starty; que[tail].s = 0; que[tail].f = 0; tail++; book[startx][starty] = 1; flag = 0; while(head<tail) for(k=0;k<=3;k++) //枚举四个方向 tx = que[head].x + next[k][0]; ty = que[head].y + next[k][1]; if(tx<1 || ty<1 || tx>n || ty>m) continue; if(a[tx][ty] == 0&& book[tx][ty] == 0) book[tx][ty] = 1; //标记为已走过 que[tail].x = tx; que[tail].y = ty; que[tail].s = que[head].s + 1; tail++; if(tx == p && ty == q) flag = 1; break; if(flag == 1) break; head++; printf("%d",que[tail-1].s); getchar();getchar(); return 0;
运行结果:
以上是关于BFS 算法的主要内容,如果未能解决你的问题,请参考以下文章
(王道408考研数据结构)第六章图-第四节3:最短路径之BFS算法(思想代码演示答题规范)