ภาพรวมปัญหา
ได้รับเมทริกซ์ 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