Cerinta completa
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.

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.
matrixRotation has the following parameter(s):
- int matrix[m][n]: a 2D array of integers
- int r: the rotation factor
Prints
It should print the resultant 2D integer array and return nothing. Print each row on a separate line as space-separated integers.
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
Sample Input
Sample Input #01
STDIN Function ----- -------- 4 4 2 rows m = 4, columns n = 4, rotation factor r = 2 1 2 3 4 matrix = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]] 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.
Limbajul de programare folosit: java8
Cod:
import java.util.Scanner;
public class Solution {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int M = in.nextInt();
int N = in.nextInt();
int R = in.nextInt();
int[][] matrix = new int[M][N];
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
matrix[i][j] = in.nextInt();
}
}
int[][] rotated = new int[M][N];
for (int i = 0; i * 2 < Math.min(M, N); i++) {
int height = M - i * 2;
int width = N - i * 2;
int circumference = (height + width - 2) * 2;
int offset = R % circumference;
Point from = new Point(i, i);
Point to = new Point(i, i);
for (int j = 0; j < offset; j++) {
to = move(to, M, N);
}
for (int j = 0; j < circumference; j++) {
rotated[to.r][to.c] = matrix[from.r][from.c];
from = move(from, M, N);
to = move(to, M, N);
}
}
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
if (j != 0) {
System.out.print(" ");
}
System.out.print(rotated[i][j]);
}
System.out.println();
}
in.close();
}
static Point move(Point p, int M, int N) {
int circle = Math.min(Math.min(p.r, M - 1 - p.r),
Math.min(p.c, N - 1 - p.c));
int height = M - circle * 2;
int width = N - circle * 2;
if (p.c == circle && p.r < circle + height - 1) {
return new Point(p.r + 1, p.c);
} else if (p.r == M - 1 - circle && p.c < circle + width - 1) {
return new Point(p.r, p.c + 1);
} else if (p.c == N - 1 - circle && p.r > circle) {
return new Point(p.r - 1, p.c);
} else {
return new Point(p.r, p.c - 1);
}
}
}
class Point {
int r;
int c;
Point(int r, int c) {
this.r = r;
this.c = c;
}
}
Scor obtinut: 1.0
Submission ID: 464602679
Link challenge: https://www.hackerrank.com/challenges/matrix-rotation-algo/problem
