สมมติว่าเรามีสตริง s แสดงการเคลื่อนที่ของหุ่นยนต์ หุ่นยนต์อยู่ที่ (0, 0) หันหน้าไปทางเหนือ สตริง s อาจมีตัวอักษร:
"F"เดินหน้าหนึ่งหน่วย"L"หมุนซ้าย 90 องศา"R"หมุนขวา 90 องศา
ถ้าหุ่นยนต์ทำตามการเคลื่อนที่ใน s ซ้ำๆ เราต้องตรวจสอบว่ามีกล่องในระนาบที่หุ่นยนต์ไม่เคยออกจากไปหรือไม่
เช่น ถ้าอินพุตคือ s = "FFRFRFFRF" ผลลัพธ์จะเป็น True เพราะหุ่นยนต์เดิน 2 หน่วยทางเหนือ หันขวา เดิน 1 บล็อก หันขวา เดิน 2 หน่วยทางใต้ หันขวา อีกครั้ง สร้างเป็นกล่อง
ขั้นตอนการแก้ปัญหา
moves := อาร์เรย์ทิศทาง [[0, -1], [1, 0], [0, 1], [-1, 0]]r, c := 0, 0,d := 0- สำหรับ
timesในช่วง0ถึง3:- สำหรับ
iในช่วง0ถึงขนาดของ s:- ถ้า
s[i] == "F"ให้(r, c) := (r + moves[d][0], c + moves[d][1]) - มิฉะนั้นถ้า
s[i] == "L"ให้d := (d + 3) % 4 - มิฉะนั้นถ้า
s[i] == "R"ให้d := (d + 1) % 4
- ถ้า
- ถ้า
r == 0และc == 0คืนค่าTrue
- สำหรับ
- คืนค่า
False
ตัวอย่างการใช้งาน
def solve(s):
moves = [[0, -1], [1, 0], [0, 1], [-1, 0]]
r, c = 0, 0
d = 0
for times in range(4):
for i in range(len(s)):
if s[i] == "F":
r, c = r + moves[d][0], c + moves[d][1]
elif s[i] == "L":
d = (d + 3) % 4
elif s[i] == "R":
d = (d + 1) % 4
if r == 0 and c == 0:
return True
return False
s = "FFRFRFFRF"
print(solve(s))
อินพุต
"FFRFRFFRF"
เอาต์พุต
True