当涉及到矩阵遍历和任何类型的搜索时,我发现我经常需要验证一个潜在的项,以添加到我的队列或递归。
假设我们在看这个矩阵:

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/

10-11 15:28