跨矩阵链

时间:2016-09-26 05:12:05

标签: recursion matrix

给定二进制矩阵,我们想检查两端节点之间是否存在路径,例如:

0 1 0 0 0

0 1 1 0 0

0 0 1 1 0

0 0 0 1 0

这种情况从第一行到最后一行有一条链,在一些行中被拉伸。同样,即使从左列到右列也有结果,结果应该是真的。

我考虑过在顶行和左列中为每个正元素编写一个递归探索函数。你能提出更好的建议吗?

1 个答案:

答案 0 :(得分:0)

其中一个解决方案是使用Set

  1. 浏览每一行
  2. 如果字段值为1且其中一个已访问过的邻居位于Set内,请将其坐标(x,y)添加到Set
  3. 最后,检查Set是否包含最后一行的任何坐标 - 如果是,则有路径。
  4. 因为你没有提到你想使用哪种语言,这里是它在Javascript(ES6)中的样子:

    let matrix = '01000
    01100
    00110
    00010'.split('\n').map((row) => { return row.split('') });
    
    let set = new Set();
    let cols = matrix[0].length;
    let rows = matrix.length;
    
    for(let col=0; col < cols; col++){
        if(matrix[0][col] == '1'){
            set.add(`0,{col}`);
        }
    }
    
    for(let row=1; row < rows-1; row++){
        for(let col=1; col < cols; col++){
            if(matrix[row][col] == '1' && 
              (set.has(`{row-1},{col-1}`) || 
               set.has(`{row-1},{col}`) || 
               set.has(`{row-1},{col+1}`) || 
               set.has(`{row},{col-1}`))){
                set.add(`{row},{col}`);
            }
        }
    }
    
    let row = rows-1;
    
    for(let col=0; col < cols; col++){
        if(matrix[row][col] == '1' && 
          (set.has(`{row-1},{col-1}`) || 
           set.has(`{row-1},{col}`) || 
           set.has(`{row-1},{col+1}`) || 
           set.has(`{row},{col-1}`))){
            // HAS PATH
        }
    }