Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 추가 공간을 사용하지 않고 시계 방향으로 행렬을 90도 회전

<시간/>

행렬 패턴을 형성하는 데 사용할 2차원 배열이 제공됩니다. 작업은 행렬을 시계 방향으로 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

설명 − 정수 유형의 2차원 배열이 제공됩니다. 이제 시계 방향으로 행렬을 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

설명 − 정수 유형의 2차원 배열이 제공됩니다. 이제 시계 방향으로 행렬을 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가 있는 행렬로 처리될 2차원 정수 배열을 입력하세요.

  • 데이터를 Rotate_ClockWise(arr) 함수에 전달합니다.

  • Rotate_ClockWise(arr)

    함수 내부
    • i에서 row_col_size/2보다 작아질 때까지 FOR 루프를 시작합니다.

    • 루프 내에서 j가 row_col_size - i - 1보다 작을 때까지 0에서 다른 루프 FOR를 시작합니다.

    • 루프 내에서 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에서 row_col_size보다 작아질 때까지 FOR 루프를 시작합니다. 루프 내에서 j가 row_col_size보다 작을 때까지 j에서 0까지 FOR 또 다른 루프를 시작합니다. j++ 및 인쇄 arr[i][j].

2. 효율적인 접근

  • row_col_size가 있는 행렬로 처리될 2차원 정수 배열을 입력하세요.

  • 데이터를 Rotate_ClockWise(arr) 함수에 전달합니다.

  • Rotate_ClockWise(arr)

    함수 내부
    • i에서 row_col_size보다 작아질 때까지 FOR 루프를 시작합니다.

    • 루프 내에서 j가 row_col_size - i보다 작을 때까지 0에서 다른 루프 FOR를 시작합니다.

    • 루프 내에서 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]에서 ptr.

    • i에서 row_col_size / 2보다 작은 i까지 루프 FOR를 시작합니다. 루프 내에서 j에서 row_col_size보다 작은 j까지 0에서 다른 루프 FOR를 시작합니다. 루프 내에서 ptr을 arr[i][j]로, arr[i][j]를 arr[row_col_size - 1 - i][j]로, arr[row_col_size - 1 - i][j]를 ptr

  • i에서 row_col_size보다 작아질 때까지 FOR 루프를 시작합니다. 루프 내에서 j가 row_col_size보다 작을 때까지 j에서 0까지 FOR 또 다른 루프를 시작합니다. 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