Computer >> Máy Tính >  >> Lập trình >> C ++

Xoay ma trận 90 độ mà không sử dụng thêm khoảng trống trong C ++

Chúng tôi được cung cấp một mảng 2-D sẽ được sử dụng để tạo thành một mẫu ma trận. Nhiệm vụ là xoay ma trận 90 độ theo hướng ngược chiều kim đồng hồ sao cho hàng đầu tiên trở thành cột đầu tiên, hàng thứ hai trở thành cột thứ hai và thứ ba trở thành cột thứ ba và thử thách là chúng ta không phải sử dụng thêm bất kỳ không gian.

Hãy để chúng tôi xem các kịch bản đầu ra đầu vào khác nhau cho việc này -

Đầu vào -

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

Đầu ra -

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

Giải thích - chúng ta được cung cấp một mảng 2-D kiểu số nguyên. Bây giờ chúng ta sẽ xoay ma trận 90 độ theo chiều kim đồng hồ.

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

Đầu vào -

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

Đầu ra -

Rotation of a matrix by 90 degree in clockwise direction without using any extra space is:
9 32 5
1 6  7
2 7  3

Giải thích - chúng ta được cung cấp một mảng 2-D kiểu số nguyên. Bây giờ chúng ta sẽ xoay ma trận 90 độ theo chiều kim đồng hồ.

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

Phương pháp tiếp cận được sử dụng trong chương trình dưới đây như sau

1. Phương pháp tiếp cận ngây thơ

  • Nhập một mảng số nguyên 2-D sẽ được coi là ma trận với row_col_size.

  • Truyền dữ liệu vào hàm Rotate_ClockWise (arr).

  • Bên trong hàm Rotate_ClockWise (arr)

    • Bắt đầu vòng lặp FOR từ tôi đến 0 cho đến khi tôi nhỏ hơn row_col_size / 2.

    • Bên trong vòng lặp, bắt đầu một vòng lặp FOR khác từ j đến 0 cho đến j nhỏ hơn row_col_size - i - 1.

    • Bên trong vòng lặp, đặt ptr thành arr [i] [j], arr [i] [j] thành arr [row_col_size - 1 - j] [i], arr [row_col_size - 1 - j] [i] thành arr [row_col_size - 1 - i] [row_col_size - 1 - j], arr [row_col_size - 1 - i] [row_col_size - 1 - j] thành arr [j] [row_col_size - 1 - i] và arr [j] [row_col_size - 1 - i] sang ptr.

  • Bắt đầu vòng lặp FOR từ i đến 0 cho đến khi tôi nhỏ hơn row_col_size. Bên trong vòng lặp, bắt đầu một vòng lặp FOR khác từ j đến 0 cho đến j nhỏ hơn row_col_size; j ++ và in arr [i] [j].

2. Phương pháp tiếp cận hiệu quả

  • Nhập một mảng số nguyên 2-D sẽ được coi là ma trận với row_col_size.

  • Truyền dữ liệu vào hàm Rotate_ClockWise (arr).

  • Bên trong hàm Rotate_ClockWise (arr)

    • Bắt đầu vòng lặp FOR từ tôi đến 0 cho đến khi tôi nhỏ hơn row_col_size.

    • Bên trong vòng lặp, bắt đầu một vòng lặp FOR khác từ j đến 0 cho đến j nhỏ hơn row_col_size - i.

    • Bên trong vòng lặp, đặt ptr thành arr [i] [j], arr [i] [j] thành arr [row_col_size - 1 - j] arr [row_col_size - 1 - i] và [row_col_size - 1 - j] thành arr [ j] [row_col_size - 1 - i] sang ptr.

    • Bắt đầu vòng lặp FOR từ i đến 0 cho đến khi tôi nhỏ hơn row_col_size / 2. Trong vòng lặp, bắt đầu một vòng lặp FOR khác từ j đến 0 cho đến khi j nhỏ hơn row_col_size. Bên trong vòng lặp, đặt ptr thành arr [i] [j], arr [i] [j] thành arr [row_col_size - 1 - i] [j] và arr [row_col_size - 1 - i] [j] thành ptr

  • Bắt đầu vòng lặp FOR từ i đến 0 cho đến khi tôi nhỏ hơn row_col_size. Bên trong vòng lặp, bắt đầu một vòng lặp FOR khác từ j đến 0 cho đến j nhỏ hơn row_col_size; j ++ và in arr [i] [j].

Phương pháp tiếp cận ngây thơ

Ví dụ

#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;
}

Đầu ra

Nếu chúng ta chạy đoạn mã trên, nó sẽ tạo ra Kết quả sau

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

Phương pháp Tiếp cận Hiệu quả

Ví dụ

#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;
}

Đầu ra

Nếu chúng ta chạy đoạn mã trên, nó sẽ tạo ra Kết quả sau

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