Доброго!
Смотрел способы транспонирования матриц.
И возникла такая мысль: как минимальными средствами сдвинуть только контур (пусть будет квадтратной) матрицы. Например, на 1 позицию, или последовательно на несколько позиций (в цикле).
Конутром матрицы считается: 1) Верхняя строка
2) Правый столбец
3) Нижняя строка
4) Левый столбец
Относительно пользователя, глядящего в экран :)
Пока получился такой алгоритм: сохранить контур в отельном массиве - contour.
1) Циклически сдвинуть на 1 позицию массив contour.
2) Переписать строки и столбцы в матрице.
Для матрицы размером 3*3, получается так:
<?php /*Циклическое смещение контура на единицу*/
/*Матрица*/
$matrix[0]=array( 1,1,1);
$matrix[1]=array( 2,2,2);
$matrix[2]=array( 3,3,3);
/*Контур матрицы */
$contour=array(1,1,1,2,3,3,3,2);
for ($j=0; $j < 8; $j++)
{
/*Сдвигаем массив*/
$temp=array_pop($contour);
array_unshift($contour, $temp);
/*Смещение верхней и правой границы*/
foreach ($matrix[0] as $k => $value)
{
$matrix[0][$k]=$contour[$k];
$matrix[$k][2]=$contour[$k+2];
}
/*Смещение нижней границы*/
$x=3;
for ($i=0; $i < 3; $i++)
$matrix[2][--$x]=$contour[$i+4];
/*Смещение левой границы*/
$x=2;
for ( $i=0; $i < 1; $i++)
$matrix[--$x][0]=$contour[$i+7];
/*Печатаем*/
print '<br/>';
print_r($matrix[0]);
print '<br/>';
print_r($matrix[1]);
print '<br/>';
print_r($matrix[2]);
print '<br/>';
print_r($matrix[3]);
print '<br/>';
print '<br/>';
print '<br/>';
}
?>