javascript - 检查计算岛屿的异常情况

标签 javascript algorithm matrix data-structures

当谈到矩阵遍历和任何类型的搜索时,我发现我经常需要验证一个潜在的项目以添加到我的队列或递归。

假设我们正在查看这个矩阵:

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/

相关文章:

神经元激活顺序算法

algorithm - 如何使用最少的位生成任意范围内的无偏随机数

python - 有效地计算矩阵中所有行的操作

algorithm - 如何用常数值填充二维数组,效率比 n^2 更高?

Javascript 事件监听器在对象方法中不起作用

python - 将矩阵乘以常量内存中的转置

javascript - 我如何使用 meteor subscriptionsReady() 来确保数据在渲染模板之前就绪?

c++ - 你能改变二维数组在 C++/CUDA 中的排序方式吗

javascript - 分隔 div 的 CSS 列

javascript - Angular 2 : Can't add form group to form array in reactive Forms