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;
}