岛屿相关算法题

101 阅读1分钟

算法题

给定一个由 '1'(污染源)和 '0'(未被污染)组成的的二维网格,计算二维网格全部被污染成'1'需要几次。一个污染源它是通过水平方向或垂直方向上污染未被污染的'0'区域。(刚被污染成 '1'没有污染功能,需下次才具备污染能力)

实例
输入:grid =[
        [0, 0, 0],
        [0, 1, 0],
        [0, 0, 0]
 ]
输出:2

输入:grid =[
        [0, 0, 0],
        [0, 0, 1],
        [0, 0, 0]
 ]
输出:3
 
 function createArr(grid1, init, n_sqrt, temp_grid = []) {
        for (let index = 1; index < grid1.length + 1; index++) {
            if (index % n_sqrt == 0) {
                temp_grid.push(grid1.slice(init, index))
                init = index
            }
        }
        return temp_grid
    }
    //0 代表海水,1 代表陆地
    function isMain(grid) {
        let res = 0;
        let m = grid.length,
            n = grid[0].length;
        for (let i = 0; i < m; i++) {
            for (let j = 0; j < n; j++) {
                if (grid[i][j] == '1') {
                    dfs(grid, i, j - 1, n) //左 1,1
                    dfs(grid, i, j + 1, n) //右
                    dfs(grid, i + 1, j, n) //下
                    dfs(grid, i - 1, j, n)
                }

            }
        }
        return res;
    }

    function dfs(grid, i, j, n) {
        if (i < 0 || j < 0 || i >= n || j >= n) {
            // 超出索引边界
            return;
        }
        if (grid[i][j] == 1) {
            //已经是海水了
            return;
        }
        //将(i,j)变成海水
        grid[i][j] = 2

        //console.log("i:" + i, "j:" + j);
    }

    var grid = [
        [0, 0, 0],
        [0, 1, 0],
        [0, 0, 0]
    ]


    var nun_count = 0

    function start(grid) {
       //二维数组转成一维数组
        let grid_flat = grid.flat()
        const n_sqrt = Math.sqrt(grid_flat.length)
        let init = 0
        //将数组里的2全部替换成1,其余不变
        grid_flat = grid_flat.map(ele => {
            if (ele == 2) {
                return 1
            } else if (ele == 1) {
                return 1
            } else {
                return 0
            }
        })

        let flag = grid_flat.some(ele => ele == 0)
        let temp_grid = []
        //一维数组转成二维数组
        grid = createArr(grid_flat, init, n_sqrt, temp_grid)

        if (flag) {
            isMain(grid)
            start(grid)
            nun_count = nun_count + 1


        }
    }

    start(grid)
    console.log('grid:', grid);
 console.log('nun_count:', nun_count);