Есть матрица 19*19, нужно переставить строки и столбцы, т.е. у нас есть кол-во строк:19.
Сначала переставляем 1 и 2 строку(2 поменялась местами с 1), потом 1 и 3 строку(2 поменялась с 1, поэтому 1 сейчас на 2 индексе).Столбцы должны меняться так же как и строки.
Загвоздка в том, что когда мы переставляем строки в матрице, мы проверяем среднее число. Если новое среднее число больше среднего числа у изначальной матрицы, то перестановку в паре 1 и 2 мы не делаем, а переходим на 2 и 3.
Пытался написать функцию(createNewMatrix) через рекурсию, но как то не получается. Помогите пожалуйста
<?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);
}