Submission

Status:

----------

Subtask/Task Score:

0/100

Score: 0

User: porpeang

Problemset: กราฟสัญญาณดิจิทัล

Language: cpp

Time: 0.004 second

Submitted On: 2026-10-07 14:06:49

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main() {
    // เพิ่มประสิทธิภาพการรับ/ส่งข้อมูล
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    string aa;
    int a = 0;

    if (!(cin >> aa >> a)) return 0;

    vector<int> vec;

    // 1. แปลงข้อมูลนำเข้าเป็นลำดับบิต (0 หรือ 1)
    // หากเป็นสตริงเลขฐานสอง จะเริ่มด้วย '0' หรือ '1'
    // หากเป็นข้อความภาษาอังกฤษ จะเป็นตัวอักษร 'A'-'Z' หรือ 'a'-'z' (แปลงเป็น ASCII 8 บิต)
    if (aa[0] == '0' || aa[0] == '1') {
        for (size_t i = 0; i < aa.size(); i++) {
            vec.push_back(aa[i] - '0');
        }
    } else {
        for (size_t i = 0; i < aa.size(); i++) {
            for (int b = 7; b >= 0; b--) {
                vec.push_back((aa[i] >> b) & 1);
            }
        }
    }

    int N = vec.size();
    int width = N * (a - 1) + 1; // ความกว้างรวมของกราฟ

    // 2. สร้าง Grid ขนาด a x width กำหนดค่าเริ่มต้นเป็น '_' ทั้งหมด
    vector<string> grid(a, string(width, '_'));

    // 3. กฎข้อ 4: สัญญาณเริ่มต้นที่ +5V เสมอ
    // ถ้าบิตแรกเป็น 0 ให้สร้างเส้นแนวตั้งเชื่อมจาก +5V (แถว 0) ลงมาถึง 0V (แถว a-1) ที่ x = 0
    if (vec[0] == 0) {
        for (int j = 0; j < a; j++) {
            grid[j][0] = 'X';
        }
    } else {
        grid[0][0] = 'X';
    }

    // 4. วาดเส้นแนวนอนของแต่ละบิต และวาดเส้นแนวตั้งเมื่อมีการเปลี่ยนสัญญาณ
    for (int i = 0; i < N; i++) {
        int curr_val = vec[i];
        int row_target = (curr_val == 1) ? 0 : a - 1; // 1 อยู่แถวบนสุด (0), 0 อยู่แถวล่างสุด (a-1)

        int x_start = i * (a - 1);
        int x_end = (i + 1) * (a - 1);

        // วาดเส้นสัญญาณแนวนอน
        for (int x = x_start; x <= x_end; x++) {
            grid[row_target][x] = 'X';
        }

        // หากบิตถัดไปมีการเปลี่ยนระดับสัญญาณ ให้สร้างเส้นแนวตั้งเชื่อมทุกแถวที่ x_end
        if (i + 1 < N && vec[i] != vec[i + 1]) {
            for (int j = 0; j < a; j++) {
                grid[j][x_end] = 'X';
            }
        }
    }

    // 5. แสดงผลกราฟ
    for (int j = 0; j < a; j++) {
        cout << grid[j] << '\n';
    }

    return 0;
}