Advertisement
YChalk

Matrix Rotation

May 11th, 2022
678
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 8.75 KB | None | 0 0
  1. import java.io.*;
  2. import java.math.*;
  3. import java.security.*;
  4. import java.text.*;
  5. import java.util.*;
  6. import java.util.concurrent.*;
  7. import java.util.function.*;
  8. import java.util.regex.*;
  9. import java.util.stream.*;
  10. import static java.util.stream.Collectors.joining;
  11. import static java.util.stream.Collectors.toList;
  12.  
  13. class Result {
  14.  
  15.     /*
  16.      * Complete the 'matrixRotation' function below.
  17.      *
  18.      * The function accepts following parameters:
  19.      *  1. 2D_INTEGER_ARRAY matrix
  20.      *  2. INTEGER r
  21.      */
  22.  
  23.     public static void matrixRotation(List<List<Integer>> matrix, int r) {
  24.     // Write your code here
  25.         List<List<Integer>> layers = layers(matrix);
  26.        
  27.         /*for (List<Integer> list : layers) {
  28.             System.out.println(list);
  29.         }*/
  30.        
  31.         for (int i = 0; i < layers.size(); i++) {
  32.             layers.set(i, rotateA(layers.get(i), r));
  33.         }
  34.        
  35.         /*for (List<Integer> list : layers) {
  36.             System.out.println(list);
  37.         }*/
  38.        
  39.         int[][] rotated = layersToMatrix(layers, matrix);
  40.        
  41.         for (int[] row : rotated) {
  42.             for (int i : row) {
  43.                 System.out.print(i + " ");
  44.             }
  45.             System.out.println("");
  46.         }
  47.     }
  48.    
  49.     public static int[][] layersToMatrix(List<List<Integer>> layers, List<List<Integer>> matrix) {
  50.         int[][] result = new int[matrix.size()][matrix.get(0).size()];
  51.         int rows = result.length;
  52.         int columns = result[0].length;
  53.         int start = 0;
  54.         int row;
  55.         int column;
  56.        
  57.         int topStop, rightStop, bottomStop, leftStop;
  58.        
  59.         for (List<Integer> layer : layers) {
  60.             row = start;
  61.             column = start;
  62.             topStop = columns - 1;
  63.             rightStop = topStop + rows - 1;
  64.             bottomStop = rightStop + columns - 1;
  65.             leftStop = bottomStop + rows - 1;
  66.            
  67.             for (int i = 0; i < topStop; i++) {
  68.                 try {
  69.                 result[row][column] = layer.get(i);
  70.                 column++;
  71.                 } catch (ArrayIndexOutOfBoundsException e) {
  72.                     System.out.println(layer);
  73.                     System.out.println(layer.get(i));
  74.                     System.out.println("row " + row);
  75.                     System.out.println("column " + column);
  76.                     System.out.println("top " + topStop);
  77.                     System.out.println("right " + rightStop);
  78.                     System.out.println("bottom " + bottomStop);
  79.                     System.out.println("left " + leftStop);
  80.                 }
  81.             }
  82.            
  83.             for (int i = topStop; i < rightStop; i++) {
  84.                 result[row][column] = layer.get(i);
  85.                 row++;
  86.             }
  87.            
  88.             for (int i = rightStop; i < bottomStop; i++) {
  89.                 result[row][column] = layer.get(i);
  90.                 column--;
  91.             }
  92.            
  93.             for (int i = bottomStop; i < leftStop; i++) {
  94.                 result[row][column] = layer.get(i);
  95.                 row--;
  96.             }
  97.             start++;
  98.             columns-=2;
  99.             rows-=2;
  100.         }
  101.        
  102.         return result;
  103.     }
  104.    
  105.     /*public static void layersToMatrix(List<List<Integer>> layers, List<List<Integer>> matrix) {
  106.         int rows = matrix.size();
  107.         int columns = matrix.get(0).size();
  108.         int start = 0;
  109.         int endColumn = columns-1;
  110.         int endRow = rows - 1;
  111.         int row = 0;
  112.         int column = 0;
  113.        
  114.         for (List<Integer> layer : layers) {
  115.             for (int i = 0; i < columns; i++) {
  116.                 matrix.get(row).set(column, layer.get(i));
  117.                 column++;
  118.             }
  119.            
  120.             column--;
  121.             //row++;
  122.            
  123.             for (int i = columns; i < columns + rows; i++) {
  124.                 matrix.get(row).set(column, layer.get(i));
  125.                 row++;
  126.             }
  127.            
  128.             row--;
  129.             //column--;
  130.            
  131.             for (int i = columns + rows; i < columns - 2 + rows * 2; i++) {
  132.                 matrix.get(row).set(column, layer.get(i));
  133.                 column--;
  134.             }
  135.            
  136.             column++;
  137.             //row++;
  138.            
  139.             for (int i = columns - 2  + rows * 2; i < (columns-2) * 2 + rows * 2; i++) {
  140.                 matrix.get(row).set(column, layer.get(i));
  141.                row++;
  142.             }
  143.            
  144.             rows -= 2;
  145.             columns -=2;
  146.             start++;
  147.             row = start;
  148.             column = start;
  149.         }
  150.         //return matrix;
  151.     }*/
  152.    
  153.     public static List<Integer> rotateA(List<Integer> layer, int r) {
  154.         int[] rotation = new int[layer.size()];
  155.        
  156.         int shift = 0;
  157.         int index;
  158.        
  159.         r = r % layer.size();
  160.         if (r == 0) {
  161.             return layer;
  162.         }
  163.        
  164.         for (int i = 0; i < layer.size(); i++) {
  165.             shift = Math.abs(i - r);
  166.             index = i - r < 0 ?
  167.                 layer.size() - shift : i - r;
  168.             rotation[index] = layer.get(i);
  169.         }
  170.        
  171.         return Arrays.stream(rotation)
  172.             .mapToObj(i -> Integer.valueOf(i))
  173.             .collect(Collectors.toList());
  174.     }
  175.    
  176.     /*public static void rotate(List<Integer> layer, int r) {
  177.         int index = 0;
  178.         int shift = 0;
  179.         int current = 0;
  180.         int temp = layer.get(0);
  181.        
  182.         r = r % layer.size();
  183.         if (r == 0) {
  184.             return;
  185.         }
  186.        
  187.         for (int i = 0; i < layer.size(); i++) {
  188.             current = temp;
  189.             shift = Math.abs(index - r);
  190.             index = index - r < 0 ?
  191.                 layer.size() - shift : index - r;
  192.             temp = layer.get(index);
  193.             layer.set(index, current);
  194.         }
  195.        
  196.     }*/
  197.    
  198.     public static List<List<Integer>> layers(List<List<Integer>> matrix) {
  199.         List<List<Integer>> layers = new ArrayList<>();
  200.         int start = 0;
  201.         int endRow = matrix.size()-1-start;
  202.         int endColumn = matrix.get(start).size()-start;
  203.        
  204.         while (start < endRow && start < endColumn) {
  205.             List<Integer> layer = new ArrayList<>();
  206.            
  207.             layer.addAll(top(matrix, start, endColumn));
  208.             layer.addAll(right(matrix, start, endRow, endColumn));
  209.             layer.addAll(bottom(matrix, start, endRow, endColumn));
  210.             layer.addAll(left(matrix, start, endRow));
  211.            
  212.             layers.add(layer);
  213.            
  214.             start++;
  215.             endColumn--;
  216.             endRow--;
  217.         }
  218.        
  219.         return layers;
  220.     }
  221.    
  222.     public static List<Integer> top(List<List<Integer>> matrix, int start, int endColumn){
  223.         return matrix.get(start).subList(start, endColumn);
  224.     }
  225.    
  226.     public static List<Integer> right(List<List<Integer>> matrix, int start, int endRow, int endColumn){
  227.         List<Integer> result = new ArrayList<>();
  228.         for (int i = start+1; i < endRow; i++) {
  229.             result.add(matrix.get(i).get(endColumn-1));
  230.         }
  231.         return result;
  232.     }
  233.    
  234.     public static List<Integer> bottom(List<List<Integer>> matrix, int start, int endRow, int endColumn){
  235.         List<Integer> result = matrix.get(endRow).subList(start, endColumn);
  236.         Collections.reverse(result);
  237.         return result;
  238.     }
  239.    
  240.     public static List<Integer> left(List<List<Integer>> matrix, int start, int endRow){
  241.         List<Integer> result = new ArrayList<>();
  242.         for (int i = endRow-1; i > start; i--) {
  243.             result.add(matrix.get(i).get(start));
  244.         }
  245.         return result;
  246.     }
  247.  
  248. }
  249.  
  250. public class Solution {
  251.     public static void main(String[] args) throws IOException {
  252.         BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
  253.  
  254.         String[] firstMultipleInput = bufferedReader.readLine().replaceAll("\\s+$", "").split(" ");
  255.  
  256.         int m = Integer.parseInt(firstMultipleInput[0]);
  257.  
  258.         int n = Integer.parseInt(firstMultipleInput[1]);
  259.  
  260.         int r = Integer.parseInt(firstMultipleInput[2]);
  261.  
  262.         List<List<Integer>> matrix = new ArrayList<>();
  263.  
  264.         IntStream.range(0, m).forEach(i -> {
  265.             try {
  266.                 matrix.add(
  267.                     Stream.of(bufferedReader.readLine().replaceAll("\\s+$", "").split(" "))
  268.                         .map(Integer::parseInt)
  269.                         .collect(toList())
  270.                 );
  271.             } catch (IOException ex) {
  272.                 throw new RuntimeException(ex);
  273.             }
  274.         });
  275.  
  276.         Result.matrixRotation(matrix, r);
  277.  
  278.         bufferedReader.close();
  279.     }
  280. }
  281.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement