โจทย์
กำหนดเมทริกซ์ mat[row][col] ให้พิมพ์องค์ประกอบในรูปแบบ Zig-Zag (ทแยงมุมสลับด้าน)
ตัวอย่าง
Matrix 3x3: 10 20 30 40 50 60 70 80 90 Output: 10 20 40 70 50 30 60 80 90
อัลกอริทึม
เดินทางตามแนวทแยงมุม (diagonal) สลับทิศทางทุกครั้ง ใช้ตัวแปร flag บอกทิศทาง (ขึ้น/ลง) และจัดการขอบเขตเมทริกซ์
ขั้นตอนหลัก
- ส่วนบนซ้าย (upper left): วน len = 1 ถึง min(row, col)
- ส่วนกลาง (middle): จัดการกรณี row ≠ col
- ส่วนล่างขวา (lower right): วนย้อนกลับจาก max(row, col)-1 ลง 1
โค้ดภาษา C
#include <stdio.h>
#include <stdbool.h>
#define C 3
#define min(a, b) ((a) > (b) ? (b) : (a))
#define max(a, b) ((a) > (b) ? (a) : (b))
int main() {
int k = 3, l = 3;
int mat[][3] = {
{10, 20, 30},
{40, 50, 60},
{70, 80, 90}
};
int row = 0, col = 0;
bool flag = false;
int i, j, len, diag;
int MAX;
int mn = min(k, l);
// ส่วนบน
for (len = 1; len <= mn; ++len) {
for (i = 0; i < len; ++i) {
printf("%d ", mat[row][col]);
if (i + 1 == len) break;
if (flag) ++row, --col;
else --row, ++col;
}
if (len == mn) break;
if (flag) ++row, flag = false;
else ++col, flag = true;
}
// จุดเปลี่ยนทิศทาง
if (row == 0) {
if (col == k - 1) ++row;
else ++col;
flag = 1;
} else {
if (row == l - 1) ++col;
else ++row;
flag = 0;
}
// ส่วนล่าง
MAX = max(k, l) - 1;
for (len = 0, diag = MAX; diag > 0; --diag) {
if (diag > mn) len = mn;
else len = diag;
for (i = 0; i < len; ++i) {
printf("%d ", mat[row][col]);
if (i + 1 == len) break;
if (flag) ++row, --col;
else ++col, --row;
}
if (row == 0 || col == k - 1) {
if (col == k - 1) ++row;
else ++col;
flag = true;
} else if (col == 0 || row == l - 1) {
if (row == l - 1) ++col;
else ++row;
flag = false;
}
}
return 0;
}ผลลัพธ์
10 20 40 70 50 30 60 80 90