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;
    };
  • 相关阅读:
    Oracle 验证A表的2个字段组合不在B表2个字段组合里的数据
    jQuery方法一览
    Maven构建项目时index.jsp文件报错
    DDL——对数据库表的结构进行操作的练习
    不经意的小错误——onclick和click的区别
    UML基础——统一建模语言简介
    基于UML的面向对象分析与设计
    数据结构之——树与二叉树
    UML类图几种关系的总结
    C3P0连接参数解释
  • 原文地址:https://www.cnblogs.com/ccv2/p/12497293.html
Copyright © 2011-2022 走看看