Подтвердить что ты не робот

Как повернуть матрицу N x N на 90 градусов?

Как повернуть матрицу N x N на 90 градусов. Я хочу, чтобы он был на месте?

4b9b3361

Ответ 1

for(int i=0; i<n/2; i++)
   for(int j=0; j<(n+1)/2; j++)
       cyclic_roll(m[i][j], m[n-1-j][i], m[n-1-i][n-1-j], m[j][n-1-i]);


void cyclic_roll(int &a, int &b, int &c, int &d)
{
   int temp = a;
   a = b;
   b = c;
   c = d;
   d = temp;
}

Примечание Я не тестировал это, просто компонуя сейчас на месте. Протестируйте, прежде чем делать что-либо с ним.

Ответ 2

вот мое решение: (поверните pi/2 по часовой стрелке)

  • выполнить транспонирование массива (например, транспонирование матрицы)

  • отменить элементы для каждой строки

    cons int row = 10;
    cons int col = 10;
    //transpose
    for(int r = 0; r < row; r++) {
      for(int c = r; c < col; c++) {  
        swap(Array[r][c], Array[c][r]);
      }
    }
    //reverse elements on row order
    for(int r = 0; r < row; r++) {
        for(int c =0; c < col/2; c++) {
          swap(Array[r][c], Array[r][col-c-1])
        }
    }
    

если вращать pi/2 против часовой стрелки

  • транспонировать массив

  • отменить элементы в порядке столбцов

никогда не проверяйте код! любое предложение было бы оценено!

Ответ 3

Полная программа на C, которая иллюстрирует мой подход. По сути это рекурсивный алгоритм. При каждой рекурсии вы вращаете внешний слой. Остановитесь, когда ваша матрица равна 1x1 или 0x0.

#include <stdio.h>

int matrix[4][4] = {
     {11, 12, 13, 14},
     {21, 22, 23, 24},
     {31, 32, 33, 34},
     {41, 42, 43, 44} 
};

void print_matrix(int n)
{
   for (int i = 0; i < n; i++) {
      for (int j = 0; j < n; j++) {
         printf(" %d ", matrix[i][j]);
      }
      printf("\n");
   }
}

int *get(int offset, int x, int y)
{
   return &matrix[offset + x][offset + y];
}

void transpose(int offset, int n)
{
   if (n > 1) {
      for (int i = 0; i < n - 1; i++) {
         int *val1 = get(offset, 0, i);
         int *val2 = get(offset, i, n - 1);
         int *val3 = get(offset, n - 1, n - 1 - i);
         int *val4 = get(offset, n - 1 - i, 0);

         int temp = *val1;
         *val1 = *val4;
         *val4 = *val3;
         *val3 = *val2;
         *val2 = temp;
      }

      transpose(offset + 1, n - 2);
   }
}

main(int argc, char *argv[])
{
   print_matrix(4);
   transpose(0, 4);
   print_matrix(4);
   return 0;
}

Ответ 4

//Java version, fully tested

public class Rotate90degree {


        public static void reverseElementsRowWise(int[][] matrix) {
            int n = matrix.length;
            for(int i = 0; i < n; ++i) {
                for(int j = 0; j < n / 2; ++j) {
                    int temp = matrix[i][n - j - 1];
                    matrix[i][n - j - 1] = matrix[i][j];
                    matrix[i][j] = temp;
                }
            }
        }

        public static void transpose(int[][] matrix) {
            int n = matrix.length;
            for(int i = 0; i < n; ++i) {
                for(int j = i + 1; j < n; ++j) {
                    int temp = matrix[i][j];
                    matrix[i][j] = matrix[j][i];
                    matrix[j][i] = temp;
                }
            }
        }

        public static void rotate90(int[][] matrix) {
            transpose(matrix);
            reverseElementsRowWise(matrix);
        }

        public static void print(int[][] matrix) {
            int n = matrix.length;
            for(int i = 0; i < n; ++i) {
                for(int j = 0; j < n; ++j) {
                    System.out.print(matrix[i][j]);
                    System.out.print(' ');
                }
                System.out.println();
            }
        }

        public static void main(String[] args) {
            int[][] matrix = {
                    {1, 2, 3, 4},
                    {5, 6, 7, 8},
                    {9, 10, 11, 12},
                    {13, 14, 15, 16}};
            System.out.println("before");
            print(matrix);
            rotate90(matrix);
            System.out.println("after");
            print(matrix);
        }
}

Ответ 5

Вы можете создать второй массив, а затем скопировать первый во второй, прочитав строку с первой строкой и введя столбца-майор ко второму.

Итак, вы бы скопировали:

1  2  3
4  5  6
7  8  9

и вы прочитаете первую строку, затем запишите ее, начиная, например:

3
2
1