คำอธิบายปัญหา
หุ่นยนต์อยู่บนระนาบอนันต์ เริ่มต้นที่ (0,0) หันหน้าไปทางเหนือ ได้รับคำสั่ง 3 แบบ:
- G - เดินตรง 1 หน่วย
- L - เลี้ยวซ้าย 90 องศา
- R - เลี้ยวขวา 90 องศา
หุ่นยนต์จะทำซ้ำชุดคำสั่งนี้ไปเรื่อยๆ ต้องการตรวจสอบว่ามีวงกลมอยู่ที่ทำให้หุ่นยนต์ไม่เคยออกนอกวงกลมนั้นหรือไม่
ตัวอย่าง: "GGLLGG" → true (เดินไปกลับมาที่เดิม)
ข้อสังเกตสำคัญ
หุ่นยนต์จะอยู่ในวงกลมได้หาก:
- หลังจากทำคำสั่ง 1 รอบ กลับมาที่ (0,0) หรือ
- หลังจากทำคำสั่ง 1 รอบ ไม่ได้หันหน้าไปทางเหนือ (ทิศทางเปลี่ยนไป) เพราะถ้าทำซ้ำ 4 รอบจะกลับมาที่เดิม
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
int dir[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
class Solution {
public:
bool isRobotBounded(string s) {
pair<int, int> pos = {0, 0};
int k = 0; // 0=North, 1=East, 2=South, 3=West
for(char c : s) {
if(c == 'G') {
pos.first += dir[k][0];
pos.second += dir[k][1];
} else if(c == 'L') {
k = (k + 1) % 4;
} else { // 'R'
k = (k + 3) % 4; // เทียบเท่า (k - 1 + 4) % 4
}
}
// กลับมาที่จุดเริ่มต้น หรือ ไม่ได้หันหน้าไปทางเหนือ
return (pos.first == 0 && pos.second == 0) || k != 0;
}
};
int main() {
Solution ob;
cout << ob.isRobotBounded("GGLLGG");
return 0;
}
อินพุต
"GGLLGG"
เอาต์พุต
1