1. Набираем команду codeby webinar. Набираем команду для организации и проведения вебинаров. Подробнее ...

    Скрыть объявление
  2. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление
  3. Получи 30.000 рублей. Для получения денег необходимо принять участие в конкурсе авторов codeby. С условиями и призами можно ознакомиться на этой странице ...

    Внимание! Регистрация авторов на конкурс закрыта.

    Скрыть объявление

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

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

  1. Neirol

    Neirol Гость

    Репутация:
    0
    На одном из собеседований на вакансию 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(01)){}
    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->$yd][$this->$xd]))
    return 
    false;

    $this->+= $yd;
    $this->+= $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(
    12345),
    array(
    678910),
    array(
    1112131415),
    array(
    1617181920),
    array(
    2122232425)
    ));

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

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

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