zoukankan      html  css  js  c++  java
  • DFS 和 BFS

    一、DFS(深度优先搜索)——使用栈或者递归

    模版:

    dfs出口,不满足条件就退出
    
    操作
    
    递归,接着进一步DFS

    二、BFS(广度优先搜索)——使用队列

    模版:

    条件判断(边界判断,其他要求的判断)
    
    创建队列
    
    在队列中加入第一个满足条件的元素
    
    while(队列不为空) {
        取出队列头部元素
        操作
        根据头部元素,往队列中再次加入满足条件的元素
    }

    leetcode题目为例子进行应用:

    方法一、DFS(递归)

    /**
     * @param {number[][]} image
     * @param {number} sr
     * @param {number} sc
     * @param {number} newColor
     * @return {number[][]}
     */
    var floodFill = function(image, sr, sc, newColor) {
        direction=[[0,1],[0,-1],[1,0],[-1,0]];
        if(image[sr][sc]!= newColor){
            var oldcolor = image[sr][sc];
            image[sr][sc] = newColor;
            for(var k=0;k<4;k++){
                var newx = sr+direction[k][0];
                var newy = sc+direction[k][1];
                if(newx>=0 && newx<image.length && newy>=0 && newy<image[0].length && image[newx][newy]==oldcolor){
                    floodFill(image,newx,newy,newColor);
                }
            }
        }
        return image;
    };

    方法二、BFS(使用队列)

    /**
     * @param {number[][]} image
     * @param {number} sr
     * @param {number} sc
     * @param {number} newColor
     * @return {number[][]}
     */
    var floodFill = function(image, sr, sc, newColor) {
        if (image == null || image.length == 0 || image[0].length == 0 || image[sr][sc] == newColor) return image;
        var dir=[[0,1],[0,-1],[-1,0],[1,0]];
        var arr = [];
        var oldcolor=image[sr][sc];
        arr.push(sr * image[0].length + sc);
        while(arr.length>0){
            var str = arr.shift();
            var x=Math.floor(str/(image[0].length));
            var y=str%(image[0].length);
            image[x][y]=newColor;
            for(var k=0;k<4;k++){
                var newx=x+dir[k][0];
                var newy=y+dir[k][1];
                //这里的条件判断如果把image[newx][newy]==oldcolor放到前面就会报错,不知道为什么?
                if( newx>=0 && newx<image.length && newy>=0 && newy<(image[0].length) && image[newx][newy]==oldcolor )
                {
                    arr.push(newx * (image[0].length) + newy);
                }
            }
        }
        return image;
    };
  • 相关阅读:
    洛谷 P1194 飞扬的小鸟 题解
    洛谷 P1197 星球大战 题解
    洛谷 P1879 玉米田Corn Fields 题解
    洛谷 P2796 Facer的程序 题解
    洛谷 P2398 GCD SUM 题解
    洛谷 P2051 中国象棋 题解
    洛谷 P1472 奶牛家谱 Cow Pedigrees 题解
    洛谷 P1004 方格取数 题解
    洛谷 P2331 最大子矩阵 题解
    洛谷 P1073 最优贸易 题解
  • 原文地址:https://www.cnblogs.com/ccv2/p/12497293.html
Copyright © 2011-2022 走看看