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

Тема в разделе "PHP программирование", создана пользователем Neirol, 4 авг 2012.

  1. Neirol

    Neirol Гость

    На одном из собеседований на вакансию 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();
    И вместо того, чтобы решить конкретную задачу более эстетично, я только пришел к более-менее нормальному виду для общего решения задач такого типа.

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

Поделиться этой страницей