, когда дело доходит до обхода матрицы и любого вида поиска, я обнаружил, что мне часто приходится проверять потенциальный элемент, чтобы либо добавить в мою очередь, либо перезаписать., проверяя исключения в подсчете островов
говорят, что мы смотрим на эту матрицу:
var matrixTest = [
[1,1,0,0,0],
[1,1,0,0,0],
[0,0,1,0,0],
[0,0,0,1,1]
]
В этом случае, я перебирает все элементы и выполняя BFS (маркировка как посещенные), когда я сталкиваюсь с 1.
I имеют подпрограмму в моей функции 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 flow, чтобы проверить границы r + 1, r-1, c + 1 и AND-1.
Существует ли конкретный шаблон кода, который вы рекомендуете использовать, чтобы избежать необходимости делать это много раз?
в противном случае я думаю, что блок кода будет выглядеть следующим образом:
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). – Arnauld