//Given an image represented by an NxN matrix, where each pixel in the image is 4 bytes, write a method to rotate the image by 90 degrees. Can you do this in place?
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int i=s.nextInt();
int[][] matrix = new int[i][i];
for(int j=0;j<i;j++){
for(int k=0;k<i;k++){
matrix[j][k] = s.nextInt();
}
}
System.out.println("==========Input Matrix =======\n");
printMatrix(matrix,i);
Main m = new Main();
System.out.println();
System.out.println("==========Rotated Matrix =======\n");
printMatrix(m.rotate(matrix,i),i);
System.out.println("\n\n==========Rotated Matrix 2=======\n");
printMatrix(m.rotate2(matrix),i);
}
public static void printMatrix(int[][] matrix,int i){
for(int j=0;j<i;j++){
for(int k=0;k<i;k++){
System.out.print(matrix[j][k] + "\t");
}
System.out.println();
}
}
public int[][] rotate(int[][] a,int s){
int[][] result = new int[s][s];
for(int i=0;i<s;i++){
for(int j=0;j<s;j++){
result[j][s-1-i] = a[i][j];
}
}
return result;
}
public int[][] rotate2(int[][] matrix){
if (matrix.length== 0 || matrix.length != matrix[0].length) return matrix; int n = matrix.length;
for (int layer = 0; layer < n / 2; layer++) {
int first= layer;
int last= n - 1 - layer;
for(int i = first; i < last; i++) {
int offset = i - first;
int top= matrix[first][i]; // save top
matrix[first][i]=matrix[last-offset][first];
matrix[last-offset][first] =matrix[last][last - offset];
matrix[last][last - offset] = matrix[i][last];
matrix[i][last] = top; //II right<- saved top
}
}
return matrix;
}
}