Задача: Найти наибольшую площадь одинаковых чисел в матрице.Javascript - Найти большую площадь в матрице
Матрица жестко закодирована, и до сих пор у меня есть следующий код.
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script type="text/javascript">
/* ---- Function that prints a matrix and finds the largest area and its value ---- */
function LargestAreaMatrix() {
var matrix = [[1,3,2,2,2,4],
[4,3,2,2,4,4],
[4,4,1,2,3,3],
[4,3,1,2,3,1],
[4,3,3,2,2,1]];
var arrSize = matrix.length;
var itemSize = matrix[0].length;
var counter = {};
for (var i = 0; i < arrSize; i++){
for (var j = 0; j < itemSize; j++) {
//if the current element is equal to the next element
if (matrix[i][j] == matrix[i][j+1]) {
//to the object "key" is assigned the current value of the matrix and the "value" is incrementing till the condition is true
counter[matrix[i][j]] = 1 + (counter[matrix[i][j]] || 0);
console.log("Right neighbor: "+ matrix[i][j] + " - ij: " + i + " " + j);
}
if (typeof(matrix[i+1]) != "undefined") {
//if the current element is equal to the bottom element
if (matrix[i][j] == matrix[i+1][j]) {
// the value of the specific key is incrementing
counter[matrix[i][j]] = 1 + (counter[matrix[i][j]] || 0);
console.log("Down neighbor: "+ matrix[i][j] + " - ij: " + i + " " + j);
}
} else {
console.log("Not a neighbor: "+ matrix[i][j] + " - ij: " + i + " " + j);
}
}//end of for j
}//end of for i
console.log("Neighbors count: ");
console.log(counter);
//Printing the array with an html table
var table = '<table border="0">';
for (var i = 0; i < matrix.length; i++) {
table += '<tr>';
for (var j = 0; j < matrix[i].length; j++) {
table += '<td>' + matrix[i][j] + '</td>';
}
table += '</tr>';
}
table += '</table>';
document.getElementById('matrix').innerHTML = table;
}
</script>
</head>
<body>
<p></p>
<p><a href="#" onClick="LargestAreaMatrix();">Largest Area Matrix</a></p>
<label name="matrix" id="matrix"> </label>
</body>
</html>
Я сделал 2 петли для прохождения через матрицу, где я проверяю право и соседей по соседству. Если есть - я использую объект, чтобы поместить значение матрицы для ключа, в то время как значение объекта увеличивается с помощью счета ключа. Итак, в конце концов, у меня есть счет соседей для каждого значения.
Мои вопросы: По какой-то причине во внешнем цикле, где «i» достигает 4 (размер матрицы), выполняются как второй, так и другой. Почему это происходит? Кроме того - я все еще пытаюсь выяснить, как подсчитать только самую большую площадь, а не все соседи за определенное значение.
Буду признателен за любую помощь. Благодаря!
Update:
Так оказалось проще, чем я думал, что это будет :) Вот рекурсивная функция я сделал, чтобы подсчитать размер каждой области:
function findNeighbors(row, col, item){
if(row < 0 || col < 0 || row > (arrSize - 1) || col > (itemSize - 1)) {
return 0;
}
if(matrixZero[row][col] == 1) {
return 0;
}
if(item == matrix[row][col]){
matrixZero[row][col] = 1;
tempCount = 1 + (findNeighbors(row, col+1, matrix[row][col]) || 0) + (findNeighbors(row+1, col, matrix[row][col]) || 0) + (findNeighbors(row, col-1, matrix[row][col]) || 0) + (findNeighbors(row-1, col, matrix[row][col]) || 0);
return tempCount;
}
}
Сначала я проверьте, находится ли текущий элемент в диапазоне матриц, если нет - 0 добавляется значение tempCount. Затем я проверю, если элемент уже посещен, если да - 0 добавляется к temp. Затем, если элемент не посещен, ни из матрицы я не проверяю его как посетил, а добавлю 1 к временному значению и т. Д.
Затем в простой для сравнения значения tempCount с текущим максимальным значением и я переключаю их если темп выше макс.
Спасибо всем за помощь!
Я не вижу ничего странного не случилось ... https://jsfiddle.net/g90powkv/, когда я = 4, я вижу «правого соседа» и «не сосед», указывая, что только ELSE блок выполняется, а не оба. – Ixonal