บทนำ

การหมุนอาเรย์สองมิติ หรือที่เรียกว่ามาทริกซ์ เป็นปัญหาที่เกิดขึ้นบ่อยในโปรแกรมมิ่ง ซึ่งสามารถเกิดขึ้นในแอพพลิเคชันต่างๆ โดยเฉพาะในกราฟิกคอมพิวเตอร์และการจัดการข้อมูล ในบล็อกโพสต์นี้ เราจะไปลึกถึงกระบวนการการหมุน มาทริกซ์ 4x4 ด้วยมุม 90 องศา ตามเข็มนาฬิกา

ความเข้าใจเกี่ยวกับปัญหา

จินตนาการว่าคุณมีอาเรย์สองมิติที่มีโครงสร้างแบบนี้:

[1][2][3][4]
[5][6][7][8]
[9][0][1][2]
[3][4][5][6]

หลังจากหมุนมาทริกซ์นี้ 90 องศาตามเข็มนาฬิกา มันควรจะแปลงเป็น:

[3][9][5][1]
[4][0][6][2]
[5][1][7][3]
[6][2][8][4]

ในแง่ปฏิบัติ แต่ละองค์ประกอบในอาเรย์เดิมจะเลื่อนไปอยู่ในตำแหน่งใหม่ตามการหมุน แต่วิธีการที่เราจะนำไปใช้ในภาษาโปรแกรมอย่าง C# คืออะไร? มาทำให้เห็นภาพกันทีละขั้นตอน

โซลูชัน

ขั้นตอนที่ 1: เริ่มต้นมาทริกซ์

ก่อนอื่น เราจำเป็นต้องเริ่มต้นมาทริกซ์ในโปรแกรมของเรา นี่คือวิธีที่คุณสามารถทำได้:

int[,] array = new int[4,4] {
    { 1,2,3,4 },
    { 5,6,7,8 },
    { 9,0,1,2 },
    { 3,4,5,6 }
};

ขั้นตอนที่ 2: สร้างฟังก์ชันสำหรับหมุนมาทริกซ์

ถัดไป เราจะสร้างฟังก์ชันที่เรียกว่า RotateMatrix ซึ่งทำการหมุนที่ต้องการ ฟังก์ชันนี้จะรับมาทริกซ์เดิมและขนาดเป็นพารามิเตอร์ และคืนค่ามาทริกซ์ที่ถูกหมุนแล้ว

นี่คือการนำไปใช้ฟังก์ชัน RotateMatrix:

static int[,] RotateMatrix(int[,] matrix, int n) {
    int[,] ret = new int[n, n];

    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            ret[i, j] = matrix[n - j - 1, i];
        }
    }

    return ret;
}

ขั้นตอนที่ 3: การอธิบายฟังก์ชัน

  • การประกาศมาทริกซ์: เราประกาศมาทริกซ์ใหม่ ret ขนาดเดียวกับข้อมูลนำเข้า
  • ลูปซ้อน: เราใช้ลูปซ้อนเพื่อสแกนแต่ละองค์ประกอบของมาทริกซ์
  • ตรรกะการหมุน: สำหรับแต่ละองค์ประกอบที่ตำแหน่ง (i, j) เราจะแมพมันไปยังตำแหน่งใหม่ (j, n - i - 1) สูตรนี้ช่วยในการหมุนองค์ประกอบให้ถูกต้องโดย 90 องศาตามเข็มนาฬิกา

ขั้นตอนที่ 4: ทดสอบฟังก์ชัน

คุณสามารถทดสอบฟังก์ชันโดยการเรียกใช้งานและพิมพ์มาทริกซ์ที่ถูกหมุน:

int[,] rotated = RotateMatrix(array, 4);

เพียงแค่แน่ใจว่ามีการจัดทำฟังก์ชันสำหรับการพิมพ์มาทริกซ์เพื่อตรวจสอบ

สรุป

การหมุนอาเรย์สองมิติเป็นงานที่ตรงไปตรงมาหลังจากที่คุณเข้าใจการแมพดัชนี ขณะที่วิธีการปัจจุบันมีความซับซ้อนเวลาทำงาน O(n^2) การเพิ่มประสิทธิภาพอัลกอริธึมสำหรับมาทริกซ์ที่ใหญ่ขึ้น (เช่น 10000x10000) เป็นหัวข้อที่กำลังถกเถียงกันในอัลกอริธึมและโครงสร้างข้อมูล

ตอนนี้คุณสามารถหมุนอาเรย์สองมิติใดๆ ใน C# ได้อย่างมั่นใจ มีความสุขในการเขียนโค้ด!