【问题标题】:Javascript Flood fill algorithm using recursion使用递归的Javascript洪水填充算法
【发布时间】:2018-09-29 22:04:20
【问题描述】:

我有 5 X 5 矩阵,其中 1 代表土地,0 代表水。需要创建一个函数,该函数将遍历矩阵并返回它找到的土地数量。对角线 1 需要忽略。

我被我的程序卡住了。非常感谢您的帮助。

var arr = [
    [1, 1, 0, 1, 0],
    [1, 1, 0, 1, 0],
    [0, 1, 0, 0, 0],
    [0, 1, 0, 0, 0],
    [0, 0, 1, 1, 1]
];

我写了一个函数,它使用上面的矩阵来找到土地的数量。

function findLand(arr) {

var check = [],
    cntr = 0;

for(let i=0 ;i<arr.length; i++) {
    check = [];
    traverse(i, 0);
}
function traverse(x, y) {
    if(x<0 || y<0 || x > arr.length-1 || y > arr[0].length-1) {
        return;
    }

    if(arr[x][y]!=1 || check.indexOf(x+'_'+y)!=-1) {
        return;
    }
    check.push(x+'_'+y);

    traverse(x, y+1);
    traverse(x, y-1);
    traverse(x-1, y);
    traverse(x+1, y);
}

}

findLand(matrix)

【问题讨论】:

  • 你期待什么?
  • 您是在寻找组的数量还是只是总土地(个数)?
  • 您好,感谢您的回复。函数应该返回的是 1 的数量,在上面的矩阵中,我们有 3 个土地
  • return check.length; 也许?
  • 是 1 的个数是 3

标签: javascript recursion flood-fill


【解决方案1】:

这是一种同时获取地块的计数和坐标的方法。你需要遍历整个数组——现在你只遍历第一列,所以你会错过不是从那个边缘开始的地块。每次迭代都可以创建一个新的空 current 数组。最后,您将该数组推入数组“lands”,这将获得最终结果。我们还将保留一个 visited 数组,这样您就不必遍历 lands 矩阵:

var arr = [
    [1, 1, 0, 1, 0],
    [1, 1, 0, 1, 0],
    [0, 1, 0, 0, 0],
    [0, 1, 0, 0, 0],
    [0, 0, 1, 1, 1]
];

function findLand(arr) {
    var lands = [],        // the current group
        visited = new Set  // coords we've seen (set is quicker to lookup)
 
    // iterate the rows AND columns
    for(let i=0; i<arr.length; i++) {
        for(let j=0; j < arr[i].length; j++){
            if (visited.has(i+'_'+j)) continue // don't call function on visited coords
            let land = traverse(i,j)
            if(land) {                // land will be undefined if traverse returns undefined
                lands.push(land);
            }
        } 
    }
    function traverse(x, y, current = []) { // keep current local
        if(x<0 || y<0 || x > arr.length-1 || y > arr[0].length-1) {
            return;
        }
        if(arr[x][y]!=1 || visited.has(x+'_'+y)) {
            return;
        }
        current.push(x+'_'+y);
        visited.add(x+'_'+y)
        traverse(x, y+1, current);
        traverse(x, y-1, current);
        traverse(x-1, y, current);
        traverse(x+1, y, current);
        return current   // should hold one complete land mass
    }
    return lands
}

let lands = findLand(arr)
console.log("lands found: ", lands.length )
console.log("lands: ", lands)

【讨论】:

  • 非常感谢@Mark Meyer,这正是我想要的。再次感谢您纠正我。
猜你喜欢
  • 2014-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多