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

โปรแกรม C พิมพ์เมทริกซ์แบบ Zig-Zag (ซิกแซก)

โจทย์

กำหนดเมทริกซ์ 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 บอกทิศทาง (ขึ้น/ลง) และจัดการขอบเขตเมทริกซ์

ขั้นตอนหลัก

  1. ส่วนบนซ้าย (upper left): วน len = 1 ถึง min(row, col)
  2. ส่วนกลาง (middle): จัดการกรณี row ≠ col
  3. ส่วนล่างขวา (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