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

Robot Bounded In Circle ใน C++

คำอธิบายปัญหา

หุ่นยนต์อยู่บนระนาบอนันต์ เริ่มต้นที่ (0,0) หันหน้าไปทางเหนือ ได้รับคำสั่ง 3 แบบ:

  • G - เดินตรง 1 หน่วย
  • L - เลี้ยวซ้าย 90 องศา
  • R - เลี้ยวขวา 90 องศา

หุ่นยนต์จะทำซ้ำชุดคำสั่งนี้ไปเรื่อยๆ ต้องการตรวจสอบว่ามีวงกลมอยู่ที่ทำให้หุ่นยนต์ไม่เคยออกนอกวงกลมนั้นหรือไม่

ตัวอย่าง: "GGLLGG" → true (เดินไปกลับมาที่เดิม)

ข้อสังเกตสำคัญ

หุ่นยนต์จะอยู่ในวงกลมได้หาก:

  1. หลังจากทำคำสั่ง 1 รอบ กลับมาที่ (0,0) หรือ
  2. หลังจากทำคำสั่ง 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