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

พิมพ์เมทริกซ์แบบเกลียวย้อนกลับใน C++

ภาพรวมปัญหา

ได้รับเมทริกซ์ 2 มิติ ต้องพิมพ์สมาชิกทั้งหมดในลำดับเกลียวย้อนกลับ (Reverse Spiral) เริ่มจากกึ่งกลางไปด้านนอก

ตัวอย่าง

Input:
12 23 54 67
76 90 01 51
43 18 49 5
31 91 75 9

Output: 18 49 1 90 76 43 31 91 75 9 5 51 67 54 23 12

วิธีแก้ปัญหา

เริ่มจากจุดกึ่งกลางของเมทริกซ์ และพิมพ์ในทิศทางเกลียวย้อนกลับ โดยใช้ลูป 4 ลูปสำหรับการพิมพ์ในแต่ละทิศทาง

ตัวอย่างโค้ด C++

#include <iostream>
#define R 3
#define C 6
using namespace std;

void printReverseSpiral(int m, int n, int a[R][C]) {
    long int b[100];
    int i, k = 0, l = 0;
    int z = 0;
    int size = m * n;
    
    while (k < m && l < n) {
        int val;
        
        // ซ้ายไปขวา (Top row)
        for (i = l; i < n; ++i) {
            val = a[k][i];
            b[z] = val;
            ++z;
        }
        k++;
        
        // บนลงล่าง (Right column)
        for (i = k; i < m; ++i) {
            val = a[i][n-1];
            b[z] = val;
            ++z;
        }
        n--;
        
        // ขวามาซ้าย (Bottom row)
        if (k < m) {
            for (i = n-1; i >= l; --i) {
                val = a[m-1][i];
                b[z] = val;
                ++z;
            }
            m--;
        }
        
        // ล่างขึ้นบน (Left column)
        if (l < n) {
            for (i = m-1; i >= k; --i) {
                val = a[i][l];
                b[z] = val;
                ++z;
            }
            l++;
        }
    }
    
    // พิมพ์ย้อนกลับ
    for (int i = size-1; i >= 0; --i) {
        cout << b[i] << " ";
    }
}

int main() {
    int mat[R][C] = {
        {34, 5, 6, 98, 12, 23},
        {9, 12, 56, 87, 99, 1},
        {13, 91, 50, 8, 21, 2}
    };
    cout << "Printing reverse Spiral of the matrix:\n";
    printReverseSpiral(R, C, mat);
    return 0;
}

ผลลัพธ์ (Output)

Printing reverse Spiral of the matrix:
99 87 56 12 9 13 91 50 8 21 2 1 23 12 98 6 5 34