@LagusHa

Как поменять строки друг с другом в матрице смежности?

Есть матрица 19*19, нужно переставить строки и столбцы, т.е. у нас есть кол-во строк:19.

Сначала переставляем 1 и 2 строку(2 поменялась местами с 1), потом 1 и 3 строку(2 поменялась с 1, поэтому 1 сейчас на 2 индексе).Столбцы должны меняться так же как и строки.


Загвоздка в том, что когда мы переставляем строки в матрице, мы проверяем среднее число. Если новое среднее число больше среднего числа у изначальной матрицы, то перестановку в паре 1 и 2 мы не делаем, а переходим на 2 и 3.

Пытался написать функцию(createNewMatrix) через рекурсию, но как то не получается. Помогите пожалуйста

5fda837747bdc979627456.png
<?php
error_reporting(0);
function debug($arr, $die = false){
    echo '<pre>' . print_r($arr, true) . '</pre>';
    if ($die) die();
}
$matrix = [
//    [1 => 2,1,3,5,5,5,5,5,5,5,5,5,5,5,5,5,5,7],
//    [1 => 5,5,5,4,8,6,9,10,11,12,13,14,15,16,17,18,19,6],
    [1 => 2,1,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,6],
    [1 => 4,4,4,5,7,8,9,10,11,12,13,14,15,16,17,18,19,8],
];

$mass = createMatrix($matrix);
$avC = getNeighbor($mass);
createNewMatrix($mass);

function createMatrix($matrix)
{
    for ($i = 1; $i < 20; $i++) {
        for ($j = 1; $j < 20; $j++) {
            $mass[$i][$j] = 0;
            $mass[$matrix[0][$j]][$matrix[1][$j]] = 1;
            $mass[$matrix[1][$j]][$matrix[0][$j]] = 1;
        }
    }
    showMatrix($mass);
    echo getNeighbor($mass) . "<br>";
    return $mass;
}

function showMatrix($matrix){
    for ($i = 1; $i < 20; $i++) {
        for ($j = 1; $j < 20; $j++) {
            echo $matrix[$i][$j] . " ";
        }
        echo "<br>";
    }
}

function getNeighbor($matrix){
    for ($i = 1; $i < 20; $i++){
        foreach ($matrix[$i] as $k => $v){
            if ($v == 0){
                unset($matrix[$i][$k]);
            }
        }
    }
    $avC = getAverageCount($matrix);
    return $avC;
}

function getAverageCount($matrix){
    for ($i = 1; $i < 20; $i++) {
        foreach ($matrix[$i] as $k => $v) {
            $absCount[$i][$k] = abs($i - $k);
        }
    }
    for ($i = 1; $i < 20; $i++) {
        $avCount[$i] = max($absCount[$i]);
    }
    $averageCount = round(array_sum($avCount)/count($avCount), 5);
    return $averageCount;
}

function createNewMatrix($matrix){
    $massive = $matrix; // изначальный массив
    $mass = $matrix;    // новый массив
    $averageCount = getNeighbor($massive); //b - изначального массива
    $avCount = getNeighbor($mass);         //b - нового массива
    if ($averageCount >= $avCount) {
        for ($j = 1; $j < 20; $j++) {
            $tmp = $mass[$j];
            $mass[$j] = $mass[$j + 1];
            $mass[$j + 1] = $tmp;
        }
    createNewMatrix($mass);
    }
    else{
        $mass = $massive;
    }
    //debug($mass);
    //debug($matrix);
    echo "<br>";
    showMatrix($mass);
}
  • Вопрос задан
  • 45 просмотров
Пригласить эксперта
Ответы на вопрос 1
@LagusHa Автор вопроса
Сделал не через рекурсию, а двумя методами! https://github.com/LagusHa/Band-Matrix
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы