สมมติว่ามีหุ่นยนต์อยู่บนกริดอนันต์ที่เริ่มต้นที่จุด (0, 0) หันหน้าไปทางทิศเหนือ ตอนนี้หุ่นยนต์สามารถรับคำสั่งที่เป็นไปได้หนึ่งในสามประเภท -
- -2 เพื่อเลี้ยวซ้าย 90 องศา
- -1 เพื่อเลี้ยวขวา 90 องศา
- ค่าใดก็ได้ตั้งแต่ 1 ถึง 9 เพื่อเลื่อนไปข้างหน้า x หน่วย
- มีบางช่องสี่เหลี่ยมที่เป็นอุปสรรค
เรายังมีอาร์เรย์อื่นที่เรียกว่าสิ่งกีดขวาง ซึ่งบ่งชี้ว่าสิ่งกีดขวางที่ i อยู่ที่จุดกริด (obstacles[i][0],สิ่งกีดขวาง[i][1]) หากหุ่นยนต์ต้องการเคลื่อนที่เข้าหาพวกมัน หุ่นยนต์ก็จะยังคงอยู่ สี่เหลี่ยมตารางก่อนหน้าแทน
เราต้องหากำลังสองของระยะทางแบบยุคลิดสูงสุดที่หุ่นยนต์จะมาจากจุดกำเนิด
ดังนั้นหากอินพุตเป็นเหมือนคำสั่ง =[4,-1,4,-2,4] สิ่งกีดขวาง =[2,4]] ผลลัพธ์จะเป็น 65 เนื่องจากหุ่นยนต์จะติดอยู่ที่ (1, 4 ) ก่อนเลี้ยวซ้ายไปทาง (1, 8)
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- position_offset :=[(0, 1) ,(1, 0) ,(0, -1) ,(-1, 0) ]
- เริ่มต้น x, y, ทิศทาง, max_distance เป็น 0
- สำหรับแต่ละคำสั่งในคำสั่ง ทำ
- ถ้าคำสั่งเหมือนกับ -2 แล้ว
- ทิศทาง :=(ทิศทาง - 1) mod 4
- มิฉะนั้น เมื่อคำสั่งเหมือนกับ -1 แล้ว
- ทิศทาง :=(ทิศทาง + 1) mod 4
- มิฉะนั้น
- (x_off, y_off) :=position_offset[direction]
- ในขณะที่คำสั่งไม่เป็นศูนย์ ให้ทำ
- ถ้า (x + x_off, y + y_off) ไม่อยู่ในสิ่งกีดขวาง
- x :=x + x_off
- y :=y + y_off
- คำสั่ง :=คำสั่ง - 1
- ถ้า (x + x_off, y + y_off) ไม่อยู่ในสิ่งกีดขวาง
- max_distance =สูงสุดของ max_distance, x^2 + y^2
- ถ้าคำสั่งเหมือนกับ -2 แล้ว
- ส่งกลับ max_distance
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
class Solution:def robotSim(self, commands,อุปสรรค):position_offset =[(0, 1), (1, 0), (0, -1), (-1, 0)]สิ่งกีดขวาง =set(map (tuple, สิ่งกีดขวาง)) x, y, ทิศทาง, max_distance =0, 0, 0, 0 สำหรับคำสั่งในคำสั่ง:if command ==-2:direction =(direction - 1) % 4 คำสั่ง elif ==-1:ทิศทาง =(ทิศทาง + 1) % 4 อื่น:x_off, y_off =position_offset[direction] ขณะที่คำสั่ง:ถ้า (x + x_off, y + y_off) ไม่อยู่ในสิ่งกีดขวาง:x +=x_off y +=y_off command -=1 max_distance =max (max_distance, x**2 + y**2) return max_distanceob =Solution()print(ob.robotSim([4,-1,4,-2,4],[[2,4]]))ก่อน>อินพุต
[4,-1,4,-2,4],[[2,4]]ผลลัพธ์
65