2015-09-23 2 views
2

Задача: Найти наибольшую площадь одинаковых чисел в матрице.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 с текущим максимальным значением и я переключаю их если темп выше макс.

Спасибо всем за помощь!

+0

Я не вижу ничего странного не случилось ... https://jsfiddle.net/g90powkv/, когда я = 4, я вижу «правого соседа» и «не сосед», указывая, что только ELSE блок выполняется, а не оба. – Ixonal

ответ

2

Я не думаю, что вы код делает что-то странное. Но, возможно, вы не используете для этого лучшую логику. Вот работающая функция. Если вы новичок, вы можете прочитать этот код.

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 cache = {}; 

    function pulse(x, y) { 
    var queue = [], 
     visited = {}, 
     size = 0; 

    // Current cell is the first element 
    queue.push({ 
     'x' : x, 
     'y' : y 
    }); 
    visited[x + ' ' + y] = true; 
    size = 1; 

    function test(x, y, value) { 
     if (!visited[x + ' ' + y] && y >= 0 && y < matrix.length && x >= 0 && x < matrix[y].length && matrix[y][x] == value) { 
     queue.push({ 
      'x' : x, 
      'y' : y 
     }); 
     visited[x + ' ' + y] = true; 
     size += 1; 
     } 
    } 

    while (queue.length) { 
     var cell = queue.pop(), 
      value = matrix[cell.y][cell.x]; 

     // Add neighbors of the same value to the queue 
     test(cell.x - 1, cell.y, value); 
     test(cell.x + 1, cell.y, value); 
     test(cell.x, cell.y - 1, value); 
     test(cell.x, cell.y + 1, value); 
    } 

    // Cache the size for all visited cells for performances 
    for (var key in visited) { 
     cache[key] = size; 
    } 

    return size; 
    } 

    var max = 0; 

    for (var y = 0; y < matrix.length; ++y) { 
    for (var x = 0; x < matrix[y].length; ++x) { 
     if (!cache[x + ' ' + y]) { 
     var size = pulse(x, y); 

     if (size > max) { 
      max = size; 
     } 
     } 
    } 
    } 

    console.log('Largest area size', max); 
} 
0

Я побежал ваш код, и это не то, что второй, если и еще выполнены, но первым, если и еще часть второй, если заявление.

Таким образом, в первом если вы обнаружите, что матрица (I, J) является правильным соседом, а затем вы идете на тестирование для соседа вниз во второй если заявление. Однако, как я = 4 в этой точке вы пытаетесь получить доступ к ряду я + 1 должно производить неопределенной, как нет шестой строки в матрице. Вот почему и первая, если и другая часть секунды, если попали. Что-то не так с логикой, я думаю ..