ปัญหา
สมมติว่ามีหุ่นยนต์และตำแหน่งเริ่มต้นคือ (0, 0) หากเรามีลำดับการเคลื่อนไหวของมัน เราต้องตรวจสอบว่าหุ่นยนต์นี้สิ้นสุดที่ (0, 0) หลังจากทำการเคลื่อนไหวเสร็จหรือไม่
ลำดับการเคลื่อนไหวให้มาเป็นสตริง และตัวอักษร moves[i] แทนการเคลื่อนไหวครั้งที่ i สัญลักษณ์คือ R สำหรับขวา, L สำหรับซ้าย, U สำหรับขึ้น, และ D สำหรับลง หากหุ่นยนต์กลับสู่จุดกำเนิดหลังจากทำการเคลื่อนไหวทั้งหมด ให้คืนค่า true มิฉะนั้นคืนค่า false
เช่น ถ้าผนวกเข้าเป็น "RRULLD" ผลลัพธ์จะเป็น true ขวาสองหน่วย แล้วขึ้น แล้วซ้ายสองหน่วย แล้วลงอีกครั้ง ดังนั้นจึงเป็นตำแหน่งเริ่มต้น
วิธีแก้ปัญหา
- l := ขนาดของอาร์เรย์ moves
- ถ้า l เท่ากับ 0: คืนค่า true
- lft := 0, up := 0
- for i := 0 ถึง l-1 ทำ:
- ถ้า moves[i] เท่ากับ 'L': เพิ่ม lft ขึ้น 1
- ถ้า moves[i] เท่ากับ 'R': ลด lft ลง 1
- ถ้า moves[i] เท่ากับ 'U': เพิ่ม up ขึ้น 1
- ถ้า moves[i] เท่ากับ 'D': ลด up ลง 1
- ถ้า lft เท่ากับ 0 และ up เท่ากับ 0: คืนค่า true
- คืนค่า false
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
bool judgeCircle(string moves) {
int l = moves.length();
if (l == 0) {
return true;
}
int lft = 0, up = 0;
for (int i = 0; i < l; i++) {
if (moves[i] == 'L') {
lft++;
}
if (moves[i] == 'R') {
lft--;
}
if (moves[i] == 'U') {
up++;
}
if (moves[i] == 'D') {
up--;
}
}
if (lft == 0 && up == 0) {
return true;
}
return false;
}
};
int main(){
Solution ob;
cout << (ob.judgeCircle("RRULLD"));
}
อินพุต
"RRULLD"
เอาต์พุต
1