2016-01-31 4 views
0

Вот мой код для вращения квадратной матрицы по часовой стрелке на 90 градусов в Java.Вращение квадратной матрицы на 90 градусов

import java.util.ArrayList; 

public class Main { 

    public static void main(String[] args) { 
    // write your code here 
     int size = 4; 
     int[][] matrix = new int[size][size]; 
     for (int i = 0; i < size ; i++) { 
      for (int j = 0; j < size; j++) { 

       matrix[i][j] = (i+(2*j)); 
      } 
     } 
     trace(matrix, size); 
     rotate(matrix); 
     System.out.println("________________________"); 
     trace(matrix, size); 

    } 

    public static void rotate(int[][] matrix){ 
     int stop = matrix.length -1; 

     rotate(matrix, stop, 0); 
    } 

    public static void rotate(int[][] matrix, int stop, int start){ 

     if(start - stop == 1) return; 

     ArrayList<Integer> temp = new ArrayList<>(); 

     //save top row in an array 
     for (int i = start; i <= stop ; i++) { 
      temp.add(matrix[start][i]); 
     } 

     //left goes to top 
     for (int i = start; i <= stop ; i++) { 
      matrix[start][i] = matrix[stop - i][start]; 
     } 

     //bottom goes to left 
     for (int i = start; i <= stop ; i++) { 
      matrix[i][start] = matrix[stop][i]; 
     } 

     //right goes to bottom 
     for (int i = start; i <= stop ; i++) { 
      matrix[stop][stop - i] = matrix[i][stop]; 
     } 

     //temp array goes to right 
     for (int i = 0; i < temp.size() ; i++) { 
      matrix[start + i][stop] = temp.get(i); 
     } 

     rotate(matrix, stop-1, start + 1); 
    } 



    public static void trace(int[][] matrix, int size){ 
     for (int i = 0; i < size; i++) { 
      for (int j = 0; j < size ; j++) { 
       System.out.print(matrix[i][j] + " "); 

      } 
      System.out.println(); 
     } 
    } 
} 

Исходный массив и вывод показан ниже,

0 2 4 6 
1 3 5 7 
2 4 6 8 
3 5 7 9 
________________________ 
3 2 1 0 
5 4 3 2 
6 2 5 4 
3 8 7 6 

Очевидно, что ответ не совсем корректно. Хотя это почти все. Я немного потерялся из-за ошибок, любая помощь была оценена.

+0

Похоже, некоторые люди просто живут и дышат вниз вопросы голосования на переполнение стека. – Zeus

ответ

1

Этот код работает нормально. Тестовый пример представляет собой матрицу 8x8, масштабируйте ее до 4x4 для тестового примера.

public class Main { 

public static void main(String[] args) { 
// write your code here 
    int size = 8; 
    int[][] matrix = new int[size][size]; 
    for (int i = 0; i < size ; i++) { 
     for (int j = 0; j < size; j++) { 

      matrix[i][j] = (i+(2*j)); 
     } 
    } 
    trace(matrix, size); 
    rotate(matrix); 
    System.out.println("________________________"); 
    trace(matrix, size); 

} 

public static void rotate(int[][] matrix){ 
    int stop = matrix.length -1; 

    rotate(matrix, stop, 0); 
} 

public static void rotate(int[][] matrix, int stop, int start){ 

    if(start - stop == 1) return; 

    int [] temp = new int[stop-start]; 

    //save top row in an array 
    for (int i = 0; i < stop-start ; i++) { 
     temp[i] = matrix[start][start+i+1]; 
    } 
    //System.out.println(Arrays.toString(temp)); 

    //left goes to top 
    for (int i = start; i < stop ; i++) { 
     matrix[start][start+stop-i] = matrix[i][start]; 
    } 

    //bottom goes to left 
    for (int i = start; i < stop ; i++) { 
     matrix[i][start] = matrix[stop][i]; 
    } 

    //right goes to bottom 
    for (int i = start; i < stop ; i++) { 
     matrix[stop][i] = matrix[start+stop-i][stop]; 
    } 

    //temp array goes to right 
    for (int i = 0; i < temp.length ; i++) { 
     matrix[start + i + 1][stop] = temp[i]; 
    } 

    rotate(matrix, stop-1, start + 1); 
} 



public static void trace(int[][] matrix, int size){ 
    for (int i = 0; i < size; i++) { 
     for (int j = 0; j < size ; j++) { 
      System.out.printf("%2d ", matrix[i][j]); 

     } 
     System.out.println(); 
    } 
} 

}

+0

Это действительно работает правильно, но я немного потерял логику. С углами что-то происходит, чего я не совсем понимаю. Не могли бы вы объяснить это. ТИА. – Zeus

+0

Одним из изменений, которые я сделал, было не действовать во всей строке или столбце. Например, если верхняя часть была «1 2 3 4», вам нужно только повернуть «2 3 4» вправо. «1» - верхняя часть левого столбца (который также будет вращать только три). Объясняет ли это, или есть еще? –

+0

Вам нужны дальнейшие объяснения? –

Смежные вопросы