Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

หมุนเมทริกซ์ 90 องศาในทิศทางตามเข็มนาฬิกาโดยไม่ต้องใช้ช่องว่างเพิ่มเติมใน C++


เราได้รับอาร์เรย์ 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. วิธีการไร้เดียงสา

  • ป้อนอาร์เรย์จำนวนเต็ม 2 มิติที่จะถือว่าเป็นเมทริกซ์ที่มี row_col_size

  • ส่งข้อมูลไปยังฟังก์ชัน Rotate_ClockWise(arr)

  • ภายในฟังก์ชัน Rotate_ClockWise(arr)

    • เริ่มวนซ้ำ FOR จาก i ถึง 0 จนถึง i น้อยกว่า row_col_size/2.

    • ภายในลูป เริ่มวนใหม่ FOR จาก 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] and arr[j][row_col_size - 1 - i] ถึง ptr.

  • เริ่มวนซ้ำ FOR จาก i ถึง 0 จนถึง i น้อยกว่า row_col_size ภายในลูป เริ่มลูปอื่น FOR จาก j ถึง 0 จนถึง j น้อยกว่า row_col_size; j++ และพิมพ์ arr[i][j].

2. แนวทางที่มีประสิทธิภาพ

  • ป้อนอาร์เรย์จำนวนเต็ม 2 มิติที่จะถือว่าเป็นเมทริกซ์ที่มี row_col_size

  • ส่งข้อมูลไปยังฟังก์ชัน Rotate_ClockWise(arr)

  • ภายในฟังก์ชัน Rotate_ClockWise(arr)

    • เริ่มวนซ้ำ FOR จาก i ถึง 0 จนถึง i น้อยกว่า row_col_size

    • ภายในลูป เริ่มวนใหม่ FOR จาก 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] ถึง ptr.

    • เริ่มการวนซ้ำ FOR จาก i ถึง 0 จนถึง i น้อยกว่า row_col_size / 2 ภายในลูป เริ่มการวนซ้ำ FOR จาก 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

  • เริ่มวนซ้ำ FOR จาก i ถึง 0 จนถึง i น้อยกว่า row_col_size ภายในลูป เริ่มลูปอื่น FOR จาก 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