Matrix Layer Rotation

You are given a 2D matrix of dimension  and a positive integer . You have to rotate the matrix  times and print the resultant matrix. Rotation should be in anti-clockwise direction.

Rotation of a  matrix is represented by the following figure. Note that in one rotation, you have to shift elements by one step only.
matrix-rotation
It is guaranteed that the minimum of m and n will be even.
As an example rotate the Start matrix by 2:
Start         First           Second
 1 2 3 4        2  3  4  5      3  4  5  6
12 1 2 5  ->   1  2  3  6 ->   2  3  4  7
11 4 3 6      12  1  4  7       1  2  1  8
10 9 8 7      11 10  9  8     12 11 10  9
Function Description
Complete the matrixRotation function in the editor below. It should print the resultant 2D integer array and return nothing.
matrixRotation has the following parameter(s):
  • matrix: a 2D array of integers
  • r: an integer that represents the rotation factor
Input Format
The first line contains three space separated integers, , and , the number of rows and columns in , and the required rotation.
The next  lines contain  space-separated integers representing the elements of a row of .
Constraints



Output Format
Print each row of the rotated matrix as space-separated integers on separate lines.
Sample Input
Sample Input #01
4 4 2
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
Sample Output #01
3 4 8 12
2 11 10 16
1 7 6 15
5 9 13 14
Explanation #01
The matrix is rotated through two rotations.
 1  2  3  4      2  3  4  8      3  4  8 12
 5  6  7  8      1  7 11 12      2 11 10 16
 9 10 11 12  ->  5  6 10 16  ->  1  7  6 15
13 14 15 16      9 13 14 15      5  9 13 14
Sample Input #02
5 4 7
1 2 3 4
7 8 9 10
13 14 15 16
19 20 21 22
25 26 27 28
Sample Output #02
28 27 26 25
22 9 15 19
16 8 21 13
10 14 20 7
4 3 2 1
Explanation 02
The various states through 7 rotations:
1  2  3  4      2  3  4 10    3  4 10 16    4 10 16 22
7  8  9 10      1  9 15 16    2 15 21 22    3 21 20 28
13 14 15 16 ->  7  8 21 22 -> 1  9 20 28 -> 2 15 14 27 ->
19 20 21 22    13 14 20 28    7  8 14 27    1  9  8 26
25 26 27 28    19 25 26 27    13 19 25 26   7 13 19 25

10 16 22 28    16 22 28 27    22 28 27 26    28 27 26 25
 4 20 14 27    10 14  8 26    16  8  9 25    22  9 15 19
 3 21  8 26 ->  4 20  9 25 -> 10 14 15 19 -> 16  8 21 13
 2 15  9 25     3 21 15 19     4 20 21 13    10 14 20  7
 1  7 13 19     2  1  7 13     3  2  1  7     4  3  2  1
Sample Input #03
2 2 3
1 1
1 1
Sample Output #03
1 1
1 1
Explanation #03
All of the elements are the same, so any rotation will repeat the same matrix.

php
<?php


function Rotationlayer($ay, $ro) {
$len = count($ay);
$r = $ro%$len;
for($i = 0; $i < $r; $i++) {
$temp = $ay[0];
for($j =0; $j < $len; $j++) {
if($j == $len - 1) {
$ay[$j] = $temp;
} else {
$ay[$j] = $ay[$j+1];
}
}
}
return $ay;
}

// Complete the matrixRotation function below.
function matrixRotation($matrix, $ro) {
$n = count($matrix);
$m = count($matrix[0]);
$rot = array();
for($i =0; $i <min($n,$m)/2;$i++ ) {
$ar = array();
for($r = $i; $r < $m - $i -1; $r++) {
$ar[] = $matrix[$i][$r];
}
for($c = $i; $c < $n- $i -1; $c++) {
$ar[] = $matrix[$c][$m- $i - 1];
}
for($r = $m - $i -1; $r >= $i+1 ; $r--) {
$ar[] = $matrix[$n - $i - 1][$r];
}
for($c = $n - $i -1; $c >= $i+1 ; $c--) {
$ar[] = $matrix[$c][$i];
}
$rot[] = $ar;
}
$roa = array();
foreach($rot as $roi) {
$roa[] = Rotationlayer($roi, $ro);
}
$mt = array();
for($i =0; $i <min($n,$m)/2;$i++ ) {
$idx = 0;
$roay = $roa[$i];
for($r = $i; $r < $m - $i -1; $r++) {
$mt[$i][$r] = $roay[$idx];
$idx++;
}
for($c = $i; $c < $n- $i -1; $c++) {
$mt[$c][$m- $i - 1] = $roay[$idx];
$idx++;
}
for($r = $m - $i -1; $r >= $i+1 ; $r--) {
$mt[$n - $i - 1][$r] = $roay[$idx];
$idx++;
}
for($c = $n - $i -1; $c >= $i+1 ; $c--) {
$mt[$c][$i] = $roay[$idx];
$idx++;
}
}
$mta = array();
foreach($mt as $it) {
ksort($it);
$mta[] = $it;
}
foreach($mta as $item) {
foreach($item as $itm) {
echo $itm;
echo ' ';
}
echo "\n";
}
}

$mnr = explode(' ', rtrim(fgets(STDIN)));

$m = intval($mnr[0]);

$n = intval($mnr[1]);

$r = intval($mnr[2]);

$matrix == array();

for ($i = 0; $i < $m; $i++) {
$matrix_temp = rtrim(fgets(STDIN));

$matrix[] = array_map('intval',
preg_split('/ /', $matrix_temp, -1, PREG_SPLIT_NO_EMPTY));
}

matrixRotation($matrix, $r);

Comments

Popular posts from this blog

Intro to Tutorial Challenges

Mini-Max Sum