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; }
运行结果:
非学无以广才,非志无以成学。
正是因为今天的不完美,才对未来充满希望。
----长帆