Submission

Status:

[PP-SSSSSSS]

Subtask/Task Score:

{0/100}

Score: 0

User: ZanTy

Problemset: Path Finding

Language: cpp

Time: 0.002 second

Submitted On: 2026-10-09 13:03:10

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

using namespace std;

int main() {
    // Fast I/O
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int n, q;
    if (!(cin >> n >> q)) return 0;

    vector<int> r(q), c(q);
    bool out_of_range = false;

    // รับค่าตำแหน่ง (r, c) และเช็กขอบเขต
    for (int i = 0; i < q; i++) {
        cin >> r[i] >> c[i];
        if (r[i] < 0 || r[i] >= n || c[i] < 0 || c[i] >= n) {
            out_of_range = true;
        }
    }

    if (out_of_range) {
        cout << "Out of range\n";
        return 0;
    }

    // สร้างแผนที่ขนาด NxN ล้อมรอบด้วย '_'
    vector<string> arr(n, string(n, '_'));

    // วางตัวอักษรบอกลำดับจุดเริ่มต้น A, B, C...
    for (int i = 0; i < q; i++) {
        arr[r[i]][c[i]] = (char)('A' + i);
    }

    // ลากเส้นเชื่อมโยงแต่ละจุด
    for (int i = 0; i < q - 1; i++) {
        int r1 = r[i],     c1 = c[i];
        int r2 = r[i + 1], c2 = c[i + 1];

        // 1. เดินตามแนวนอนก่อน (ค่าหลัก c เปลี่ยน) -> ขวา (>) หรือ ซ้าย (<)
        if (c2 > c1) {
            for (int j = c1 + 1; j < c2; j++) {
                arr[r1][j] = '>';
            }
        } else if (c2 < c1) {
            for (int j = c1 - 1; j > c2; j--) {
                arr[r1][j] = '<';
            }
        }

        // 2. เดินตามแนวตั้งต่อ (ค่าแถว r เปลี่ยน) -> ล่าง (v) หรือ บน (^)
        // สังเกตว่าจุดสิ้นสุดการเดินแนวนอนเดิมคือ (r1, c2)
        if (c2 == c1) {
            // ถ้าไม่มีการเดินแนวนอน: ไม่ต้องทับจุดเริ่มต้น (r1, c2) ให้เริ่มจากช่องถัดไป
            if (r2 > r1) {
                for (int e = r1 + 1; e < r2; e++) {
                    arr[e][c2] = 'v';
                }
            } else if (r2 < r1) {
                for (int e = r1 - 1; e > r2; e--) {
                    arr[e][c2] = '^';
                }
            }
        } else {
            // ถ้ามีการเดินแนวนอนมาก่อน: ต้องทับจุดหักศอกเลี้ยว (r1, c2) ด้วยทิศทางแนวตั้งใหม่ด้วย
            if (r2 > r1) {
                for (int e = r1; e < r2; e++) {
                    arr[e][c2] = 'v';
                }
            } else if (r2 < r1) {
                for (int e = r1; e > r2; e--) {
                    arr[e][c2] = '^';
                }
            }
        }
    }

    // แสดงผลลัพธ์แผนที่ทั้งหมด
    for (int i = 0; i < n; i++) {
        cout << arr[i] << "\n";
    }

    return 0;
}