广度(宽度)优先搜索学习笔记

2015-08-24  22:29:53:

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

BFS,其英文全称是Breadth First Search。 BFS并不使用经验法则算法。从算法的观点,所有因为展开节点而得到的子节点都会被加进一个先进先出的队列中。一般的实验里,其邻居节点尚未被检验过的节点会被放置在一个被称为 open 的容器中(例如队列或是链表),而被检验过的节点则被放置在被称为 closed 的容器中。(open-closed表)

以上内容摘自百度百科= =


个人见解:

DFS一条路搜到底,不到南墙不回头。BFS则为搜索周围扩展的节点然后在扩展,一般用队列实现。


基本框架:

 1 Int bfs()
 2
 3 {
 4
 5 初始化,初始状态存入队列;
 6
 7 队列首指针head=0; 尾指针tail=1;
 8
 9 do
10
11  {
12
13     指针head后移一位,指向待扩展结点;
14
15     for (int i=1;i<=max;++i)                  //max为产生子结点的规则数
16
17      {
18
19       if (子结点符合条件)
20
21          {
22
23            tail指针增1,把新结点存入列尾;
24
25            if (新结点与原已产生结点重复) 删去该结点(取消入队,tail减1);
26
27    else
28
29        if (新结点是目标结点) 输出并退出;
30
31               }
32
33          }
34
35 }while(head<tail);                       //直到队列为空
36
37 }

PS:不要问窝为什么有空行,我踏马怎么知道。


TI:                                                                  细胞个数

题目描述 Description

一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。如阵列:

0234500067
1034560500
2045600671
0000000089
有4个细胞。

输入描述 Input Description

【输入格式】

整数m,n

(m行,n列)矩阵

输出描述 Output Description

【输出格式】

细胞的个数。

样例输入 Sample Input

4  10

0234500067
1034560500
2045600671
0000000089

样例输出 Sample Output

4

数据范围及提示 Data Size & Hint

1<=m,n<=1000


思路:基本的BFS,搜索每个细胞,然后扩展该细胞上下左右,若还是细胞就入队,再搜扩展的细胞……直到搜完整个图。


程序:

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};  //上下左右四个方向
 5 int num=0,n,m;
 6 char bz[2000][2000];
 7 void search(int p,int q)
 8 {
 9     int x,y,w,t,i;
10     int h[1000][2];
11     num++;//细胞数字数+1;
12     bz[p][q]='0';
13     t=0;
14     w=1;
15     h[1][1]=p;
16     h[1][2]=q;  //初始化头尾指针及队列的第一组
17         do
18       {
19           t++;//头指针+1
20           for (i=0;i<=3;i++)//枚举四个方向
21             {
22                 x=h[t][1]+dx[i];//下一个扩展节点的坐标
23                 y=h[t][2]+dy[i];
24                 if ((x>=0)&&(x<10)&&(y>=0)&&(y<10)&&(bz[x][y]!='0')) //边界判断及是否为细胞数字
25               {
26                   w++;//尾指针+1
27                   bz[x][y]='0';//已搜索过
28                   h[w][1]=x;
29                   h[w][2]=y;//入队
30               }
31             }
32       }
33     while (t<w);
34 }
35 int main()
36 {
37     freopen("puzzle.in","r",stdin);
38     freopen("puzzle.out","w",stdout);
39     int i,j;
40 for(int i=0;i<=9;i++)
41 for(int j=0;j<=9;j++)
42    bz[i][j]='1';
43     for (i=0;i<=9;i++)
44           for (j=0;j<=9;j++)
45             cin>>bz[i][j]; //读入
46     for (i=0;i<=9;i++)
47       for (j=0;j<=9;j++)
48         if (bz[i][j]!='0')
49           search(i,j);//搜索每个细胞数字
50             printf("%d",num);
51     return 0;
52     fclose(stdin);
53     fclose(stdout);
54 }


T2:武士风度的牛

题目描述 Description

农民John有很多牛,他想交易其中一头被Don称为The Knight的牛。这头牛有一个独一无二的超能力,在农场里像Knight一样地跳(就是我们熟悉的象棋中马的走法)。虽然这头神奇的牛不能跳到树上和石头上,但是它可以在牧场上随意跳,我们把牧场用一个x,y的坐标图来表示。

这头神奇的牛像其它牛一样喜欢吃草,给你一张地图,上面标注了The Knight的开始位置,树、灌木、石头以及其它障碍的位置,除此之外还有一捆草。现在你的任务是,确定The Knight要想吃到草,至少需要跳多少次。The Knight的位置用'K'来标记,障碍的位置用'*'来标记,草的位置用'H'来标记。

这里有一个地图的例子:
       11 | . . . . . . . . . .
       10 | . . . . * . . . . . 
       9 | . . . . . . . . . . 
       8 | . . . * . * . . . . 
       7 | . . . . . . . * . . 
       6 | . . * . . * . . . H 
       5 | * . . . . . . . . . 
       4 | . . . * . . . * . . 
       3 | . K . . . . . . . . 
       2 | . . . * . . . . . * 
       1 | . . * . . . . * . . 
       0 ----------------------
                  1 
        0 1 2 3 4 5 6 7 8 9 0

The Knight 可以按照下图中的A,B,C,D...这条路径用5次跳到草的地方(有可能其它路线的长度也是5):
       11 | . . . . . . . . . .
       10 | . . . . * . . . . .
       9 | . . . . . . . . . .
       8 | . . . * . * . . . .
       7 | . . . . . . . * . .
       6 | . . * . . * . . . F<
       5 | * . B . . . . . . .
       4 | . . . * C . . * E .
       3 | .>A . . . . D . . .
       2 | . . . * . . . . . *
       1 | . . * . . . . * . .
       0 ----------------------
                  1
        0 1 2 3 4 5 6 7 8 9 0

输入描述 Input Description

第一行: 两个数,表示农场的列数(<=150)和行数(<=150)

第二行..结尾: 如题目描述的图。

输出描述 Output Description

一个数,表示跳跃的最小次数。

样例输入 Sample Input

10 11
..........
....*.....
..........
...*.*....
.......*..
..*..*...H
*.........
...*...*..
.K........
...*.....*
..*....*..

样例输出 Sample Output

5

数据范围及提示 Data Size & Hint

Hint:这类问题可以用一个简单的先进先出表(队列)来解决。


思路:与细胞数字相同,将上下左右四个方向换为象棋中马八个方向即可,从起始位置开始搜索。


出现的错误:RE-->八个方向的数组开小了。何时该加w和t;


程序:

 1 #include <iostream>
 2 using namespace std;
 3 struct data
 4 {
 5     int x,y,step;
 6 }
 7 dl[30001];
 8 int jump2[9]={1,2,2,1,-1,-2,-2,-1},
 9     jump1[9]={-2,-1,1,2,2,1,-1,-2};
10 int n,m,i,w,j,t,x1,x2,y1,y2,x3,y3;
11 int a[200][200];
12 char q;
13 void bfs()
14 {
15     if (x1==x2&&y1==y2)
16       {
17           cout<<0;
18           return;
19       }
20     t=0;
21     w=1;
22     dl[t].x=x1;
23     dl[t].y=y1;
24     dl[t].step=0;
25     while (t<w)
26       {
27           for (i=0;i<=8;i++)
28             {
29                 x3=dl[t].x+jump1[i];
30                 y3=dl[t].y+jump2[i];
31                 if (a[x3][y3]!=1&&x3<=n&&x3>=1&&y3>=1&&y3<=m)
32                   {
33                        a[x3][y3]=1;
34                        dl[w].x=x3;
35                        dl[w].y=y3;
36                        dl[w].step=dl[t].step+1;
37                        if (dl[w].x==x2&&dl[w].y==y2)
38                          {
39                                cout<<dl[w].step;
40                                return;
41                          }
42                        w++;
43                   }
44             }
45           t++;
46       }
47 }
48 int main()
49 {
50     cin>>m>>n;
51     for (i=1;i<=n;i++)
52       for (j=1;j<=m;j++)
53         {
54             cin>>q;
55         if (q=='*') a[i][j]=1;
56         if (q=='K') {x1=i;y1=j;}
57         if (q=='H') {x2=i;y2=j;}
58         }
59     bfs();
60     return 0;
61 }


转载于:https://www.cnblogs.com/DMoon/p/4756139.html

广度(宽度)优先搜索学习笔记相关推荐

  1. 广度/宽度优先搜索(BFS)详解

    1.前言 广度优先搜索(也称宽度优先搜索,缩写BFS,以下采用广度来描述)是连通图的一种遍历策略.因为它的思想是从一个顶点V0开始,辐射状地优先遍历其周围较广的区域,故得名. 一般可以用它做什么呢?一 ...

  2. 【算法入门】广度/宽度优先搜索(BFS)

    广度/宽度优先搜索(BFS) [算法入门] 郭志伟@SYSU:raphealguo(at)qq.com 2012/04/27 1.前言 广度优先搜索(也称宽度优先搜索,缩写BFS,以下采用广度来描述) ...

  3. ACM算法笔记(十)深度优先搜索与宽度优先搜索

    深度优先搜索 事实上,深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次. 下面 ...

  4. 算法学习(九)之“宽度优先搜索”

    什么是宽度优先搜索? 面试题: 小岛问题 题目: 给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量. 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相 ...

  5. 算法笔记01——深度优先搜索(DFS)/宽度优先搜索(BFS)

    深度优先搜索(DFS) 从某个状态开始,不断地转移状态直到无法转移,然后回退到前一步的状态,继续转移到其他状态,如此不断重复,直至找到最终的解.深度优先搜索从最开始的状态出发,遍历所有可以到达的状态. ...

  6. 层层递进——宽度优先搜索(BFS)

    问题引入 我们接着上次"解救小哈"的问题继续探索,不过这次是用宽度优先搜索(BFS). 注:问题来源可以点击这里 http://www.cnblogs.com/OctoptusLi ...

  7. 八数码宽度优先搜索python代码_图之遍历--广度优先遍历

    何为广度优先遍历呢? 广度优先遍历(BFS),又叫宽度优先搜索或横向优先搜索,是从根结点开始沿着树的宽度搜索遍历,将离根节点最近的节点先遍历出来,在继续深挖下去. 基本思想是: 1.从图中某个顶点V0 ...

  8. 野人与传教士——宽度优先搜索(完整报告,含全部代码)

    题目: 野人与传教士渡河问题:3个野人与3个传教士打算乘一条船到对岸去,该船一次最多能运2个人,在任何时候野人人数超过传教士人数,野人就会把传教士吃掉,如何用这条船把所有人安全的送到对岸?在实现基本程 ...

  9. 图/树——宽度优先搜索(BFS)

    转载 宽度优先搜索(BFS, Breadth First Search)是一个针对图和树的遍历算法.发明于上世纪50年代末60年代初,最初用于解决迷宫最短路径和网络路由等问题. 对于下面的树而言,BF ...

  10. 生成图-深度优先搜索/宽度优先搜索

    问题提出: 考虑如下图所示的简单图所表示的缅因州的道路系统.在冬天里保持道路通路通畅的唯一方式就是经常扫雪.高速公路部分希望只扫尽可能少的道路上的雪,而确保总是存在连接任何两个乡镇的干净道路.如何才能 ...

最新文章

  1. idea怎么找到当前报错的行_科研论文如何想到不错的 idea?
  2. Selenium + Python操作IE 速度很慢的解决办法
  3. netperf -R用法
  4. MOOON-scheduler核心设计图(初稿)
  5. poj 3352 Road Construction(边-双连通分量)
  6. Android Bundle类,通过bundle实现在两个activity之间的通讯
  7. Python operator.le()函数与示例
  8. jQuery Mobile滚动事件
  9. 统计图学习-类型介绍
  10. 快速搭建MQTT服务器(MQTTnet和Apache Apollo)
  11. python123m与n的数学运算_python小白进阶之路三——循环结构入门练习+Random库练习...
  12. java方法重写和super关键字
  13. 对抗搜索之【最大最小搜索】【Alpha-Beta剪枝搜索】
  14. Python小程序(4)--52周存钱挑战
  15. LaTeX 中的数学字体
  16. 常见机器学习优点和缺点
  17. 详解Unity中的粒子系统Particle System (十)
  18. ios animation 动画效果实现
  19. 干货!旋转预测能够告诉我们分类器准确度的哪些信息?
  20. 蓝牙协议学习整理(一)蓝牙的概述

热门文章

  1. oracle drop purge
  2. 正则表达式那些事儿(一)
  3. HIVE 分区 分桶
  4. 静态代理,动态代理,Cglib代理详解
  5. Redis 学习之事务处理
  6. fiddler修改客户端发出去的请求
  7. PHP扩展迁移为PHP7扩展兼容性问题记录
  8. 库表操作 - 存储引擎
  9. 默认select选中其中一个option的值
  10. 第一阶段 高等数学——常量与变量