2016-08-06 3 views
1

, когда дело доходит до обхода матрицы и любого вида поиска, я обнаружил, что мне часто приходится проверять потенциальный элемент, чтобы либо добавить в мою очередь, либо перезаписать., проверяя исключения в подсчете островов

говорят, что мы смотрим на эту матрицу:

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]) 
     } 
    } 

ответ

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

А вы можете назвать это так:

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 ... 
+0

'if (! Matrix [r] || ! matrix [c]) 'будет работать только для квадратной матрицы. Контрольная матрица OP равна 5x4, и эта функция всегда возвращает 'false' и никогда не выполняет второй тест для (r = 3, c = 4). – Arnauld

1

Одним из решений будет использовать функцию каждый раз, когда вы пытаетесь получить доступ к матрице в положении, которое является восприимчивым быть вне границ.

Итак, matrix[r+1][c] === 1 станет readMatrix(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));

Смежные вопросы