当谈到矩阵遍历和任何类型的搜索时,我发现我经常需要验证一个潜在的项目以添加到我的队列或递归。
假设我们正在查看这个矩阵:
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/