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

หุ่นยนต์ถูกผูกไว้เป็นวงกลม C++


สมมติว่าเรามีระนาบอนันต์ ตอนแรกหุ่นยนต์จะยืนอยู่ที่ตำแหน่ง (0, 0) และหันไปทางทิศเหนือ หุ่นยนต์สามารถรับหนึ่งในสามคำสั่ง -

  • G – ตรงไป 1 หน่วย;

  • L - เลี้ยว 90 องศาไปทางซ้าย

  • R - เลี้ยว 90 องศาไปทางขวา

หุ่นยนต์ปฏิบัติตามคำสั่งที่ให้มาตามลำดับ คำแนะนำจะถูกทำซ้ำตลอดไป เราต้องตรวจสอบว่ามีวงกลมอยู่บนเครื่องบินหรือไม่ โดยที่หุ่นยนต์จะไม่ออกจากวงกลม ดังนั้นหากอินพุตเป็นเหมือน [GGLLGG] คำตอบก็จะเป็นจริง จาก (0,0) ถึง (0,2) มันจะวนซ้ำตลอดไป ดังนั้นนี่คือเส้นทางปิด และคำตอบคือ จริง

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • สร้างอาร์เรย์ dir :=[[0,1], [1,0], [0,-1], [-1,0]]

  • สร้างคู่ temp และเริ่มต้นนี่คือ (0, 0) และ k :=0

  • สำหรับฉันอยู่ในช่วง 0 ถึงขนาดของ s

    • ถ้า s[i] คือ G แล้ว

      • temp :=(dir[k, 0], dir[k, 1])

    • มิฉะนั้นเมื่อ s[i] คือ L ดังนั้น k :=(k + 1) mod 4 มิฉะนั้น k :=(k - 1) mod 4

  • หากเป็นเท็จเมื่อไม่มีอุณหภูมิ (0, 0) และ k> 0 มิฉะนั้น จะเป็นจริง

ตัวอย่าง

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

#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> temp({0,0});
      int k = 0;
      for(int i = 0; i < s.size(); i++){
         if(s[i] == 'G'){
            temp.first += dir[k][0];
            temp.second += dir[k][1];
         }else if(s[i] == 'L'){
            k = (k + 1) % 4;
         }else{
            k = ((k - 1) + 4) % 4;
         }
      }
      return temp.first == 0 && temp.second == 0 || k > 0;
   }
};
main(){
   Solution ob;
   cout << (ob.isRobotBounded("GGLLGG"));
}

อินพุต

"GGLLGG"

ผลลัพธ์

1