给定二进制矩阵,我们想检查两端节点之间是否存在路径,例如:
0 1 0 0 0
0 1 1 0 0
0 0 1 1 0
0 0 0 1 0
这种情况从第一行到最后一行有一条链,在一些行中被拉伸。同样,即使从左列到右列也有结果,结果应该是真的。
我考虑过在顶行和左列中为每个正元素编写一个递归探索函数。你能提出更好的建议吗?
答案 0 :(得分:0)
其中一个解决方案是使用Set
:
1
且其中一个已访问过的邻居位于Set
内,请将其坐标(x,y)
添加到Set
Set
是否包含最后一行的任何坐标 - 如果是,则有路径。因为你没有提到你想使用哪种语言,这里是它在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
}
}