2016-08-06 16 views
1

マトリックス・トラバーサルとあらゆる種類の検索に関して、私はしばしば潜在的なアイテムを検証してキューに追加するか、再帰的に繰り返す必要があることがわかります。この場合カウント・アイランドにおける例外のチェック

var matrixTest = [ 
     [1,1,0,0,0], 
     [1,1,0,0,0], 
     [0,0,1,0,0], 
     [0,0,0,1,1] 
] 

、私はすべての項目を反復処理していると私は1

Iが発生したとき(訪問としてマーキング)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"式が行列の境界の外側にあることを意味し、したがって未定義として処理することを意味します。

r + 1、r-1、c + 1、およびc-1の境界をチェックするif/thenフローの別のレイヤーを追加するのは非常に面倒です。

これを何度もやらなければならないことを避けるために使用することをお勧めする特定のコードパターンはありますか?

そう私はコードブロックは次のようになりますと思う:

if (r+1 < matrix.length) { 

    if(!visitMap[r+1][c] && matrix[r+1][c] === 1) { 
     q.push([r+1, c]) 
     } 
    } 

答えて

2

ます

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; 
} 

そして、あなたはこのようにそれを呼び出すことができます:このような関数の内部境界の検証とあなたの状態をカプセル化しようとすることができます

+0

'if(!matrix [r] || !matrix [c]) 'は、正方行列に対してのみ働きます。 OPテスト行列は5x4です。この関数は常に 'false'を返し、実際には(r = 3、c = 4)の2番目のテストを実行しません。 – Arnauld

1

一つの解決策は機能あなたが範囲外にあると影響を受けやすい位置に行列にアクセスしようとするたびに使用することです。

したがって、matrix[r+1][c] === 1readMatrix(c, r+1) === 1になります。

これは、重複したループであっても、全体的なパフォーマンスにはあまり影響しません。 (いずれかの分岐予測器は、最終的なマシンコードに関与している場合は、ほとんどの時間行列内にあるため、それは、ほとんどの時間を右の推測をしなければならない。)

var matrix = [ 
 
    [1,1,0,0,0], 
 
    [1,1,0,0,0], 
 
    [0,0,1,0,0], 
 
    [0,0,0,1,1] 
 
]; 
 

 
function readMatrix(x, y) { 
 
    return matrix[y] && matrix[y][x] !== undefined ? matrix[y][x] : 0; 
 
} 
 

 
console.log(readMatrix(0, 0)); 
 
console.log(readMatrix(0, 7)); 
 
console.log(readMatrix(7, 0));