在 C++ 中,不使用任何额外空间的情况下将矩阵顺时针旋转 90 度


给定一个二维数组,用于形成矩阵模式。任务是将矩阵顺时针旋转 90 度,使得最后一行变成第一列,第二行变成第二列,第一行变成第三列,并且挑战在于我们不能使用任何额外的空间。

让我们看看这个的各种输入输出场景 -

输入 -

int arr[row_col_size][row_col_size] = { { 5, 1, 4},
   { 9, 16, 12 },
   { 2, 8, 9}}

输出 -

Rotation of a matrix by 90 degree in clockwise direction without using any extra space is:
2 9 5
8 16 1
9 12 4

说明 - 我们得到一个整数类型的二维数组。现在我们将矩阵顺时针旋转 90 度。

Before rotation-:
{ { 5, 1, 4},
{ 9, 16, 12 },
{ 2, 8, 9}}
After rotation-:
2 9 5
8 16 1
9 12 4

输入   -

int arr[row_col_size][row_col_size] = { { 2, 1, 9},
   { 11, 6, 32 },
   { 3, 7, 5}}

输出   -

Rotation of a matrix by 90 degree in clockwise direction without using any extra space is:
2 9 5
8 16 1
9 12 4

说明 - 我们得到一个整数类型的二维数组。现在我们将矩阵顺时针旋转 90 度。

Before rotation-:
{ { 2, 1, 9},
{ 11, 6, 32 },
{ 3, 7, 5}}
After rotation-:
3 11 2
7 6 1
5 32 9

下面程序中使用的方案如下

1. 朴素方法

  • 输入一个将被视为具有 row_col_size 行和列的矩阵的二维整数数组。

  • 将数据传递给函数 Rotate_ClockWise(arr)。

  • 在函数 Rotate_ClockWise(arr) 内部

    • 从 i 为 0 开始循环,直到 i 小于 row_col_size/2。

    • 在循环内部,从 j 为 0 开始另一个循环,直到 j 小于 row_col_size - i - 1。

    • 在循环内部,将 ptr 设置为 arr[i][j],arr[i][j] 设置为 arr[row_col_size - 1 - j][i],arr[row_col_size - 1 - j][i] 设置为 arr[row_col_size - 1 - i][row_col_size - 1 - j],arr[row_col_size - 1 - i][row_col_size - 1 - j] 设置为 arr[j][row_col_size - 1 - i],arr[j][row_col_size - 1 - i] 设置为 ptr。

  • 从 i 为 0 开始循环,直到 i 小于 row_col_size。在循环内部,从 j 为 0 开始另一个循环,直到 j 小于 row_col_size;j++ 并打印 arr[i][j]。

2. 高效方法

  • 输入一个将被视为具有 row_col_size 行和列的矩阵的二维整数数组。

  • 将数据传递给函数 Rotate_ClockWise(arr)。

  • 在函数 Rotate_ClockWise(arr) 内部

    • 从 i 为 0 开始循环,直到 i 小于 row_col_size。

    • 在循环内部,从 j 为 0 开始另一个循环,直到 j 小于 row_col_size - i。

    • 在循环内部,将 ptr 设置为 arr[i][j],arr[i][j] 设置为 arr[row_col_size - 1 - j]arr[row_col_size - 1 - i],[row_col_size - 1 - j] 设置为 arr[j][row_col_size - 1 - i],arr[j][row_col_size - 1 - i] 设置为 ptr。

    • 从 i 为 0 开始循环,直到 i 小于 row_col_size / 2。在循环内部,从 j 为 0 开始另一个循环,直到 j 小于 row_col_size。在循环内部,将 ptr 设置为 arr[i][j],arr[i][j] 设置为 arr[row_col_size - 1 - i][j],arr[row_col_size - 1 - i][j] 设置为 ptr

  • 从 i 为 0 开始循环,直到 i 小于 row_col_size。在循环内部,从 j 为 0 开始另一个循环,直到 j 小于 row_col_size;j++ 并打印 arr[i][j]。

朴素方法

示例

#include <bits/stdc++.h>
using namespace std;
#define row_col_size 3
void Rotate_ClockWise(int arr[row_col_size][row_col_size]){
    for(int i = 0; i < row_col_size / 2; i++){
      for(int j = i; j < row_col_size - i - 1; j++){
         int ptr = arr[i][j];
         arr[i][j] = arr[row_col_size - 1 - j][i];
         arr[row_col_size - 1 - j][i] = arr[row_col_size - 1 - i][row_col_size - 1 - j];
         arr[row_col_size - 1 - i][row_col_size - 1 - j] = arr[j][row_col_size - 1 - i];
         arr[j][row_col_size - 1 - i] = ptr;
      }
   }
}
int main(){
   int arr[row_col_size][row_col_size] = { { 5, 1, 4},{ 9, 16, 12 },{ 2, 8, 9}};
   Rotate_ClockWise(arr);
   cout<<"Rotation of a matrix by 90 degree in clockwise direction without using any extra space is: \n";
   for(int i = 0; i < row_col_size; i++){
      for(int j = 0; j < row_col_size; j++){
         cout << arr[i][j] << " ";
      }
      cout << '\n';
   }
   return 0;
}

输出

如果我们运行以上代码,它将生成以下输出

Rotation of a matrix by 90 degree in clockwise direction without using any extra space is:
2 9 5
8 16 1
9 12 4

高效方法

示例

#include <bits/stdc++.h>
using namespace std;
#define row_col_size 3
void Rotate_ClockWise(int arr[row_col_size][row_col_size]){
   for(int i = 0; i < row_col_size; i++){
      for(int j = 0; j < row_col_size - i; j++){
         int ptr = arr[i][j];
         arr[i][j] = arr[row_col_size - 1 - j][row_col_size - 1 - i];
         arr[row_col_size - 1 - j][row_col_size - 1 - i] = ptr;
      }
   }
   for(int i = 0; i < row_col_size / 2; i++){
      for(int j = 0; j < row_col_size; j++){
         int ptr = arr[i][j];
         arr[i][j] = arr[row_col_size - 1 - i][j];
         arr[row_col_size - 1 - i][j] = ptr;
      }
   }
}
int main(){
   int arr[row_col_size][row_col_size] = { { 5, 1, 4},{ 9, 16, 12 },{ 2, 8, 9}};
   Rotate_ClockWise(arr);
   cout<<"Rotation of a matrix by 90 degree in clockwise direction without using any extra space is: \n";
   for(int i = 0; i < row_col_size; i++){
      for(int j = 0; j < row_col_size; j++){
         cout << arr[i][j] << " ";
      }
      cout << '\n';
   }
   return 0;
}

输出

如果我们运行以上代码,它将生成以下输出

Rotation of a matrix by 90 degree in clockwise direction without using any extra space is:
2 9 5
8 16 1
9 12 4

更新于: 2021-11-03

3K+ 浏览量

开启您的 职业生涯

完成课程获得认证

立即开始
广告