Отображение Элементов Матрицы По Спирали

  • Автор темы Neirol
  • Дата начала
N

Neirol

#1
На одном из собеседований на вакансию PHP-разработчика мне дали одно интересное задание. Его суть состояла в том, чтобы по спирали вывести элементы матрицы.
Например, есть такая матрица:
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
Соответственно, на выходе нужно получить результат 1 2 3 4 5 10 15 20 25 24 23 22 21 16 11 6 7 8 9 14 19 18 17 12 13.
Во время самого собеседования решение в лоб мне демонстрировать не хотелось, но за 15 минут, которые мне на это задание выделили я ничего умного придумать не смог.
Когда я вернулся домой, мне стало очень интересно еще раз попробовать решить эту задачу и вот что у меня получилось:

PHP:
<?php

class MatrixCkw
{
private $matrix = array();
private $cells_num;
private $x = -1;
private $y = 0;

public function __construct($matrix)
{
$this->matrix = (is_array($matrix) ? $matrix : array());
$this->cells_num = count($this->matrix) * count($this->matrix[0]);
}

public function circle()
{
while($this->echo_cell(0, 1)){}
while($this->echo_cell(1)){}
while($this->echo_cell(0, -1)){}
while($this->echo_cell(-1)){}
}

public function spiral()
{
while($this->cells_num != 0)
$this->circle();
}

private function echo_cell($yd, $xd = 0)
{
if(!isset($this->matrix[$this->y + $yd][$this->x + $xd]))
return false;

$this->y += $yd;
$this->x += $xd;

echo $this->matrix[$this->y][$this->x] . '<br />';
unset($this->matrix[$this->y][$this->x]);

$this->cells_num--;

return true;
}
}

$ckw = new MatrixCkw(array(
array(1, 2, 3, 4, 5),
array(6, 7, 8, 9, 10),
array(11, 12, 13, 14, 15),
array(16, 17, 18, 19, 20),
array(21, 22, 23, 24, 25)
));

$ckw->spiral();
И вместо того, чтобы решить конкретную задачу более эстетично, я только пришел к более-менее нормальному виду для общего решения задач такого типа.

Есть ли у кого-нибудь какие-нибудь идеи о том, как проще решить задачу именно с указанной матрицей? Буду очень благодарен за любые подсказки и решения.