• 宽度优先搜索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];
    }
      人生不如意的时候,是上帝给的长假,这个时候应该好好享受假期。
      突然有一天假期结束,时来运转,人生才是真正开始了。
  • 相关阅读:
    MVC模式-----struts2框架(2)
    MVC模式-----struts2框架
    html的<h>标签
    jsp脚本元素
    LeetCode "Paint House"
    LeetCode "Longest Substring with At Most Two Distinct Characters"
    LeetCode "Graph Valid Tree"
    LeetCode "Shortest Word Distance"
    LeetCode "Verify Preorder Sequence in Binary Search Tree"
    LeetCode "Binary Tree Upside Down"
  • 原文地址:https://www.cnblogs.com/astonc/p/9900553.html
Copyright © 2020-2023  润新知