マトリックス・トラバーサルとあらゆる種類の検索に関して、私はしばしば潜在的なアイテムを検証してキューに追加するか、再帰的に繰り返す必要があることがわかります。この場合カウント・アイランドにおける例外のチェック
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])
}
}
'if(!matrix [r] || !matrix [c]) 'は、正方行列に対してのみ働きます。 OPテスト行列は5x4です。この関数は常に 'false'を返し、実際には(r = 3、c = 4)の2番目のテストを実行しません。 – Arnauld