zoukankan      html  css  js  c++  java
  • 宽度优先搜索BFS(Breadth-First-Search)

    Breadth-First-Search

    1. 与DFS的异同

      相同点:搜索所有可能的状态。

      不同点:搜索顺序。

    2. BFS总是先搜索距离初始状态近的状态,它是按照:开始状态->只需一次转移就可到达的所有状态->只需两次转移就可到达的所有状态->……

    对同一状态只搜索一次,因此复杂度为O(状态数*转移方式)。

    3. DFS隐式地利用了栈,而BFS利用了队列,搜索时先将初始状态入队,此后出队取出状态,并把该状态可转移到的状态中尚未访问的状态入队,

    重复上述过程,直到队列为空或找到解。观察队列我们可以得知,所有状态都是按距初始状态由近及远遍历的。

    下面给出经典例题:迷宫最短路径

    description: 
    给定一个大小为N*M的迷宫。迷宫由通道和墙壁组成,每一步可以向邻接的上下左右四格的通道移动。请求出从起点到终点所需的最小步数。请注意,本题假定从起点一定可以移动到终点。

    样例输入输出: 
    输入: 
    这里写图片描述
    输出: 
    22

    AC Code:

    int INF=0x3f3f3f3f;
    typedef pair<int,int> P;
    int N,M,sx,sy,gx,gy; 
    char maze[N][M];
    int d[N][M];//记录到各位置的最短距离 
    int dx[4]={1,0,-1,0},dy={0,1,0,-1};
    int bfs(){
        queue<P> q; q.push(P(sx,sy));
        memset(d,INF,sizeof(d));
        d[sx][sy]=0;
        while(!q.empty()){
            P p=q.front(); q.pop();
            if(p.first ==gx&&p.second ==gy) break;
            for(int i=0;i<4;i++){
                int nx=P.first +dx[i],ny=P.second +dy[i];
                if(nx>=0&&nx<N&&ny>=0&&ny<M&&maze[nx][ny]!='#'&&d[nx][ny]==INF){
                    q.push(P(nx,ny));
                    d[nx][ny]=d[p.first ][p.second]+1;
                }
            }
        }
        return d[gx][gy];
    }
      人生不如意的时候,是上帝给的长假,这个时候应该好好享受假期。
      突然有一天假期结束,时来运转,人生才是真正开始了。
  • 相关阅读:
    js,jquery小知识点
    httpd.conf中文祥解(转载)
    web_report_data_point(原创)
    用lr查看apache的服务情况
    检查链接的工具
    DNS缓存(转载)
    在linux下使用用Valgrind查找内存泄漏和无效内存访问(转载)
    初次接触php
    qtp 基础代码转载自51testing中的kai_top 网友。
    descriptive programming转载51testing 作者:周坚
  • 原文地址:https://www.cnblogs.com/astonc/p/9900553.html
Copyright © 2011-2022 走看看