Решение 90 градусов вращения матрицы n х N


Идею взял от сюда и следующий-это мой PHP реализацию. Как говорится, 90 градусов матрица вращения в основном сдвигает столбцы в строки. Например:

|1,2,3|     becomes      |7,4,1|
|4,5,6|   ----------->>  |8,5,2|
|7,8,9|                  |9,6,3|

Обратите внимание, как строки 1,2,3, после поворота стала колонка.Решение построено на этой модели.

Вот код:

class MatrixRotator
{
    public static function rotate($matrix)
    {
        $result_arr=[];
        for($i=0; $i<count($matrix); $i++)
        {
            $inner_arr = [];
            for($j=0; $j<count($matrix[$i]); $j++)
            {
                $item = $matrix[$j][$i];
                array_unshift($inner_arr, $item);
            }
            array_push($result_arr, $inner_arr);
        }
        return $result_arr;
    }
}


print_r(MatrixRotator::rotate([[1,2,3],[4,5,6],[7,8,9]]));

Вот вывод:

|7,4,1|
|8,5,2|
|9,6,3|


172
1
задан 31 марта 2018 в 09:03 Источник Поделиться
Комментарии
1 ответ

Нет ничего действительно неправильно с вашего класса, но вы можете использовать такие функции и foreach вместо for.

Также, позвонив в свой класс MatrixRotator - это немного странно. Класс используется, чтобы объединить и выделить несколько методов (= функции) и свойства (= переменные) в удобной упаковке. А rotate() способ, вероятно, будет частью набора методов, которые могут изменить матрицу. И в этом случае имело бы смысл хранить матрицы данных в матрицу класса. Это потребует методы set и Get.

Это выльется в нечто подобное:

class Matrix
{
private $data = [];

public function __construct($data)
// accepts an array with matrix data and stores it
{
$this->data = $data;
}

public function rotateClockwise()
// rotate a matrix once clockwise
{
// check that the matrix contains data
if (isset($this->data[0]) && is_array($this->data[0]))
{
// perform the actual rotation
$rotated = [];
foreach (array_keys($this->data[0]) as $columnKey)
{
$rotated[] = array_reverse(array_column($this->data,$columnKey));
}
$this->data = $rotated;
}
// return this class so this method can be chained
return $this;
}

public function getData()
// returns the stored matrix
{
return $this->data;
}
}

Затем он может быть использован такой:

// creation of a matrix
$matrix = new Matrix([[1,2,3],[4,5,6],[7,8,9]]);

// rotation and output
echo '<pre>';
print_r($matrix->rotateClockwise()->getData());
echo '</pre>';

Теперь легко поставить и другие методы манипуляции матрицы в этом классе. Например, путем выходить array_reverse() от rotateClockwise() вы получите rotateAntiClockwise() метод. Так давайте сделаем это:

class Matrix
{
private $data = [];

public function __construct($data)
{
$this->data = $data;
if (!$this->isValid()) trigger_error("Matrix data is invalid.");
}

public function isValid()
{
if (!is_array($this->data)) return FALSE;
foreach ($this->data as $row)
{
if (!is_array($row)) return FALSE;
}
return TRUE;
}

public function reverseEachRow()
{
if ($this->isValid())
{
foreach ($this->data as $rowKey => $row)
{
$this->data[$rowKey] = array_reverse($row);
}
}
return $this;
}

public function rotateAntiClockwise()
{
if ($this->isValid() && isset($this->data[0]))
{
$rotated = [];
foreach (array_keys($this->data[0]) as $columnKey)
{
$rotated[] = array_column($this->data,$columnKey);
}
$this->data = $rotated;
}
return $this;
}

public function rotateClockwise()
{
return $this->rotateAntiClockwise()
->reverseEachRow();
}

public function getData()
{
return $this->isValid() ? $this->data : FALSE;
}

}

$matrix = new Matrix([[1,2,3],[4,5,6],[7,8,9]]);

echo '<pre>';
print_r($matrix->rotateClockwise()->getData());
echo '</pre>';

Я оставил все комментарии, чтобы сохранить код короткий, и я также централизованная проверка действительности. Это выходит за рамки вашего вопроса, но показывает вам, почему вы не хотите назвать свой класс MatrixRotatorэто слишком специфические.

1
ответ дан 4 апреля 2018 в 09:04 Источник Поделиться