算法题
给定一个由 '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
}
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)
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;
}
grid[i][j] = 2
}
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
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);