宽度优先搜索(BFS)

宽度优先搜索,又称为广度优先搜索,简称BFS

搜索过程:从初始结点开始,逐层向下扩展,即第n层搜索未完成,不得进入下一层搜索

一、初始结点入队,进入循环

二、取出队列的第一个元素

三、判断该结点是不是目标结点,如果是目标结点,则问题解决,跳出循环

四、如果该结点不是目标结点,判断其是否能够扩展,若不能,跳到步骤二

五、如果该结点能扩展,将其子结点放入队列的尾部

六、跳到步骤二

用一个经典的例子(走迷宫)来感受下

给定一个二维数组 int a[10][10] = {0 , 1 , 0 , 0 , 0

                 0 , 1 , 0 , 1 , 0

                 0 , 0 , 0 , 0 , 0

                 0 , 1 , 1 , 1 , 0

                 0 , 0 , 0 , 1 , 0 } ;

它表示一个迷宫,其中“1”代表墙,“0”代表通路,只能横着走或竖着走,要求编写程序找出从左上角到右下角的最短路径的长度

#include<iostream>

using namespace std ;

int dx[] = {-1,0,1,0} ;
int dy[] = {0,1,0,-1} ;

int m , n ;

int map[10][10] ;

int visit[10][10] = {0} ;

typedef struct Node {
    int x , y ;
    int step ;
}Node;

bool is_ok(Node cur)    {
    if(cur.x < 0 || cur.x >= m || cur.y < 0 || cur.y >= n)
        return false ;
    return true ;
}

void bfs()    {
    Node node[1000] ;
    int first , last ;
    first = last = 0 ;
    Node cur ;
    cur.x = 0 , cur.y = 0 ; cur.step = 0 ;
    node[last++] = cur ;
    visit[0][0] = 1 ;
    while(first < last)    {
        cur = node[first++] ;
        if(cur.x == 4 && cur.y == 4)    {
            cout << cur.step << endl ;
            break ;
        }
        for(int i = 0 ; i < 4 ; i++)    {
            Node next ;
            next.x = cur.x + dx[i] ;
            next.y = cur.y + dy[i] ;

            if(map[next.x][next.y] == 1)
                continue ;
            if(visit[next.x][next.y] == 1)
                continue ;
                cout << next.x << " " << next.y << endl ;
            if(is_ok(next) == true)    {
                next.step = cur.step + 1 ;
                visit[next.x][next.y] = 1 ;
                node[last++] = next ;
            //    cout << last << endl ;
            }
        }
    }
}

int main()    {
    int m , n ;
    cin >> m >> n ;
    for(int i = 0 ; i < m ; i++)
        for(int j = 0 ; j < n ; j++)
            cin >> map[i][j] ;
    bfs() ;
    return 0 ;
}
时间: 2024-12-23 23:35:45

宽度优先搜索(BFS)的相关文章

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

广度/宽度优先搜索(BFS) [算法入门] 1.前言 广度优先搜索(也称宽度优先搜索,缩写BFS,以下采用广度来描述)是连通图的一种遍历策略.因为它的思想是从一个顶点V0开始,辐射状地优先遍历其周围较广的区域,故得名. 一般可以用它做什么呢?一个 广度/宽度优先搜索(BFS) 算法导论里边会给出不少严格的证明,我想尽量写得通俗一点,因此采用一些直观的讲法来伪装成证明,关键的point能够帮你get到就好. 2.图的概念 刚刚说的广度优先搜索是连通图的一种遍历策略,那就有必要将图先简单解释一下.

挑战程序2.1.5 穷竭搜索&gt;&gt;宽度优先搜索(练POJ3669)

先对比一下DFS和BFS         深度优先搜索DFS                                   宽度优先搜索BFS 明显可以看出搜索顺序不同. DFS是搜索单条路径到底部,再回溯. BFS是搜索近的状态,直到底部,一般在求解最短路径或者最短步数上应用. BFS要用到队列呢.. 队列的用法看一看http://blog.csdn.net/cindywry/article/details/51919282 练习题系列--------------------- 题目:p

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

问题引入 我们接着上次“解救小哈”的问题继续探索,不过这次是用宽度优先搜索(BFS). 注:问题来源可以点击这里 http://www.cnblogs.com/OctoptusLian/p/7429645.html 最开始小哼在入口(1,1)处,一步之内可以到达的点有(1,2)和(2,1). 但是小哈并不在这两个点上,那小哼只能通过(1,2)和(2,1)这两点继续往下走. 比如现在小哼走到了(1,2)这个点,之后他又能够到达哪些新的点呢?有(2,2).再看看通过(2,1)又可以到达哪些点呢?可以

算法7-4:宽度优先搜索

宽度优先搜索的基本思想就是先将源点添加到一个队列中, 每次从队列中取出一个顶点,将该顶点的邻居顶点中没有拜访过的顶点都添加到队列中,最后直到队列消耗完毕为止. 应用 宽度优先搜索可以解决最短路径问题.而最短路径算法在互联网中应用非常广泛,尤其是路由这块.因为路由追求的是高效,所以每个路由路径都是通过最短路径计算出来的.如果没有最短路径算法,我们可能就享受不到这么快的网速了. 另外,宽度优先搜索在快递行业也会用到,用于计算最短路径. 代码 import java.util.Stack; /** *

宽度优先搜索

Breadth First Search 宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型.Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想.其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果.换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止. 与树的层序遍历一样 遍历结果为 1 2 3 4 5 6 .....21 22 操作: 根节点入队: wh

(总结)宽度优先搜索(Breadth First Search)

ACM入门最经典的开局一般都是宽搜. 宽度优先搜索(以下均简称bfs)一般用于树和图的搜索,在ACM中属于比较基础的技巧,因此需要非常熟练的掌握. 那么从最基础的bfs开始讲起.在一个迷宫中,有一个起点和一个终点(出口),和一些障碍物(无法通过). 比如下图

2.3 基于宽度优先搜索的网页爬虫原理讲解

上一节我们下载并使用了宽度优先的爬虫,这一节我们来具体看一下这个爬虫的原理. 首先,查看HTML.py的源代码. 第一个函数: def get_html(url): try: par = urlparse(url) Default_Header = {'X-Requested-With': 'XMLHttpRequest', 'Referer': par[0] + '://' + par[1], 'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64)

基础算法 --- BFS(广度优先搜索/宽度优先搜索)

个人理解 BFS是一种最简便的图搜索算法,通过遍历整张图直到找到目标节点: 从算法的角度看,所有因为展开节点而得到的字节点会被存储到一个FIFO的数据结构中,被遍历过的节点存储在一个容器中(一般是一个set),防止重复搜索 图解 如图所示,我们想要获取从S到E节点的最短路径,运用BFS,如何处理?? 主要思想是:从节点S开始将其所有临近子节点存放到一个队列中,然后标记这些节点到最初顶点S的距离为1: 然后根据队列的先进先出特定,出队列,判断是否为目标节点:如果不是,将出队节点的临近子节点入队,直

&quot;《算法导论》之‘图’&quot;:深度优先搜索、宽度优先搜索及连通分量

本文兼参考自<算法导论>及<算法>. 以前一直不能够理解深度优先搜索和广度优先搜索,总是很怕去碰它们,但经过阅读上边提到的两本书,豁然开朗,马上就能理解得更进一步.  1. 深度优先搜索  1.1 迷宫搜索 在<算法>这本书中,作者写了很好的一个故事.这个故事让我马上理解了深度优先搜索的思想. 如下图1-1所示,如何在这个迷宫中找到出路呢?方法见图1-2. 图1-1 等价的迷宫模型 探索迷宫而不迷路的一种古老办法(至少可以追溯到忒修斯和米诺陶的传说)叫做Tremaux搜