BFS广度优先搜索

BFS——广度优先搜索

广度优先搜索是通过对图的完全遍历来达到要求的点的算法。其对图的遍历是如同波浪一样,每层按照制定的方式一层一层向下搜。

如:



4
2 4
1


在以3为起点进行bfs搜索,搜索方式是每次只搜其上下左右的数,找其中比(最开始的)起点小的数。第一次就只会搜索到4(上),4(右),1(下),2(左),但是其中只有2和1满足条件,于是会将2和1作为下一层的起点,然后继续搜下去,直到不能再搜为止(在图中有四层,分别由四种颜色表示)。我们通常用队列来存储每次需要判断的起点,一开始3(红)在队列中,将3(红)读取后,把满足情况的1,2(绿)加入队列,依次类推。

由此我们可以将bfs看成是一棵倒着的树,3(红)为其根节点;2,1(绿)为其子节点,2,1(蓝)又分别为2,1(绿)的子节点,2(粉)为1(蓝)的子节点。


我们通过一道例题来了解bfs的具体代码:

hrbust 1143 泉水:

同博客题解链接:

http://blog.csdn.net/ilblue/article/details/52892373

原题链接:

http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1143


题意是让你找出图中所有能从起点到达的比起点高度低的地方个数。



  
  
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<iostream>
  4. #include<algorithm>
  5. #include<queue>
  6. using namespace std;
  7. const int MAX = 1000;
  8. struct Point{   // 定义点的结构体
  9. int x,y;
  10. }start,zhuan,number;
  11. int sum;
  12. int hang,lie;
  13. int mapp[MAX+ 9][MAX+ 9];
  14. int gao[MAX+ 9][MAX+ 9];
  15. int step1[ 4] = { 1, 0, -1, 0};
  16. int step2[ 4] = { 0, 1, 0, -1};
  17. int bfs(Point start) //起始点
  18. {
  19. queue<Point> que;   //将起时点压入队列
  20. que.push(start);
  21. mapp[start.x][start.y] = 1;
  22.   while(!que.empty()){
  23. number = que.front();  // 读出队列的第一个元素进行下一层的判断,直到这一层的元素都判断完后才会开始下一层的判断
  24. que.pop();
  25.    for( int i = 0;i < 4;i++){
  26. zhuan.x = number.x+step1[i];  // 得出取出元素的上下左右的坐标
  27. zhuan.y = number.y+step2[i];
  28.     if(zhuan.x<=hang && zhuan.x>= 1 && zhuan.y<=lie && zhuan.y>= 1 && mapp[zhuan.x][zhuan.y]!= 1 && gao[start.x][start.y]>=gao[zhuan.x][zhuan.y]){
  29. que.push(zhuan);   //如果满足则将其压入队列
  30. mapp[zhuan.x][zhuan.y] = 1;
  31. sum++;
  32. }
  33. }
  34. }
  35.   return sum;
  36. }
  37. void init()
  38. {
  39. memset(mapp, 1, sizeof(mapp));
  40. for( int i = 1;i <= hang;i++){
  41. for( int j = 1;j <= lie;j++){
  42. mapp[i][j] = 0;
  43. }
  44. }
  45. sum = 1;
  46. }
  47. int main()
  48. {
  49. while( scanf( "%d%d%d%d",&hang,&lie,&start.x,&start.y) != EOF){
  50. init();
  51. for( int i = 1;i <= hang;i++){
  52. for( int j = 1;j <= lie;j++){
  53. scanf( "%d",&gao[i][j]);
  54. }
  55. }
  56. printf( "%d\n",bfs(start));
  57. }
  58. return 0;
  59. }

可以看出,在该题中对数的计数只需在每次压入队列时,对计数器加一。bfs的优势在于对有关层数的问题上速度比dfs更快,但是,bfs在层数越高得时候,时间会非常大,就需要进行剪枝操作。


猜你喜欢

转载自blog.csdn.net/weixin_38654235/article/details/88739003