当涉及到矩阵遍历和任何类型的搜索时,我发现我经常需要验证一个潜在的项,以添加到我的队列或递归。
假设我们在看这个矩阵:
var matrixTest = [
[1,1,0,0,0],
[1,1,0,0,0],
[0,0,1,0,0],
[0,0,0,1,1]
]
在本例中,当遇到1时,我将遍历所有项并执行bfs(标记为已访问)。
我在BFS函数中有一个子例程,给定一个坐标r和c,它验证从它开始的所有可能路径(r+1,r-1,c+1,c-1)。
问题在于这段代码
if(!visitMap[r+1][c] && matrix[r+1][c] === 1) {
q.push([r+1, c])
}
visitmap是我在算法旁边创建的一个矩阵,以确保我不会处理一个点两次
矩阵是输入矩阵
但是,在测试之前我需要验证输入,因为javascript抛出了这个错误
TypeError: Cannot read property '3' of undefined
我假设这意味着我的“r+1”表达式位于矩阵的边界之外,因此处理为未定义的。
添加另一层if/then流来检查r+1、r-1、c+1和c-1的边界,这看起来非常乏味。
有没有一个特别的代码模式,你会建议使用,以避免多次这样做?
否则我认为代码块将如下所示:
if (r+1 < matrix.length) {
if(!visitMap[r+1][c] && matrix[r+1][c] === 1) {
q.push([r+1, c])
}
}
最佳答案
您可以尝试将边界和条件的验证封装在如下函数中:
function pushToQueue(visitMap, matrix, r, c) {
if( typeof(matrix[r]) == "undefined"
|| typeof(matrix[r][c]) == "undefined" ) {
return false;
}
return !visitMap[r][c] && matrix[r][c] === 1;
}
你可以这样称呼它:
if(pushToQueue(visitMap, matrix, r + 1, c)) {
q.push([r+1, c]);
}
if(pushToQueue(visitMap, matrix, r - 1, c)) {
q.push([r-1, c]);
}
// etc ...
关于javascript - 检查岛屿计数中的异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38807154/