説明
無限のXY平面上のロボットは、点(0、0)から始まり、北を向いています。ロボットは、次の3種類のコマンドのいずれかを受け取ることができます。
- -2:左に90度回転し、
- -1:右に90度回転する、または
- 1 <= k <= 9:k単位前進します。
グリッドの正方形のいくつかは障害物です。i番目の障害物はグリッドポイントの障害物[i] =(xi、yi)にあります。
ロボットがそれらの上に移動しようとすると、ロボットは代わりに前のグリッドスクエアに留まります(ただし、ルートの残りの部分をたどり続けます)。
ロボットが原点の2乗からの最大ユークリッド距離を返します(つまり、距離が5の場合は、25を返します)。
注意:
- 北は+ Y方向を意味します。
- 東は+ X方向を意味します。
- 南は-Y方向を意味します。
- 西は-X方向を意味します。
例1:
Input: commands = [4,-1,3], obstacles = []
Output: 25
Explanation: The robot starts at (0, 0):
1. Move north 4 units to (0, 4).
2. Turn right.
3. Move east 3 units to (3, 4).
The furthest point away from the origin is (3, 4), which is 32 + 42 = 25 units away.
例2:
Input: commands = [4,-1,4,-2,4], obstacles = [[2,4]]
Output: 65
Explanation: The robot starts at (0, 0):
1. Move north 4 units to (0, 4).
2. Turn right.
3. Move east 1 unit and get blocked by the obstacle at (2, 4), robot is at (1, 4).
4. Turn left.
5. Move north 4 units to (1, 8).
The furthest point away from the origin is (1, 8), which is 1^2 + 8^2 = 65 units away.
制約:
- 1 <=コマンド。長さ<= 104
- コマンド[i]は、リスト[-2、-1,1,2,3,4,5,6,7,8,9]の値の1つです。
- 0 <=障害物。長さ<= 104
- -3 * 104 <= xi、yi <= 3 * 104
- 答えは2 ^ 31未満であることが保証されています。
分析
質問の意味は次のとおりです。位置(0,0)に立っているロボットで、いくつかのコマンドが与えられています。-2は左に90度回転することを意味し、-1は右に90度回転することを意味し、正の数は現在の中で前進することを意味します方向。ステップしてから、ロボットが通過できない場所である障害物の配列を与えました。たとえば、ロボットの前に障害物があります。このとき、ロボットはxステップ進むように指示を受けます。 、しかし障害物のため、命令を実行できません。ロボットは所定の位置に留まりました。
考え方は非常に簡単です。ロボットのコマンドをシミュレートすると、最終的な宛先がわかります。コマンド-2および-1を受信するときは、回転コードの処理に注意してください。-2は左側にあり、次に
di=(di-1)%4
-1は右側にあります
di=(di+1)%4
これをdirs = [[0,1]、[1,0]、[0、-1]、[-1,0]]に対してシミュレートして、これが当てはまるかどうかを確認できます。[0,1]は右に[1,0]になり、[1,0]は左に[0,1]になります。これは、上記の式と一致しています。
- cmdがコマンドではなく、ロボットが実行する必要のあるステップ数の場合、到着した場所が障害物にあるかどうか、ある場合は到達できないかどうか、そうでない場合は到達できるかどうか、および座標を判断する必要があります。と解像度が更新されます。cmdステップの数はループごとに段階的に判断され、cmdステップを直接追加することはできず、障害物の座標がスキップされる可能性があることに注意してください。
興味がある場合は、自分でデバッグできます。デバッグコードについては、コード2を参照してください。
コード
class Solution:
def robotSim(self, commands: List[int], obstacles: List[List[int]]) -> int:
dirs=[[0,1],[1,0],[0,-1],[-1,0]]
x=0
y=0
di=0
obstacleSet=set(map(tuple,obstacles))
res=0
for cmd in commands:
if(cmd==-2):
di=(di-1)%4
elif(cmd==-1):
di=(di+1)%4
else:
for k in range(cmd):
x1=x+dirs[di][0]
y1=y+dirs[di][1]
if((x1,y1) not in obstacleSet):
x=x1
y=y1
res=max(res,x*x+y*y)
return res
コード2
class Solution:
def robotSim(self, commands, obstacles) -> int:
dirs=[[0,1],[1,0],[0,-1],[-1,0]]
x=0
y=0
di=0
obstacleSet=set(map(tuple,obstacles))
res=0
print(obstacleSet)
for cmd in commands:
if(cmd==-2):
di=(di-1)%4
elif(cmd==-1):
di=(di+1)%4
else:
for k in range(cmd):
x1=x+dirs[di][0]
y1=y+dirs[di][1]
if((x1,y1) not in obstacleSet):
x=x1
y=y1
res=max(res,x*x+y*y)
return res
if __name__=="__main__":
commands = [4,-1,4,-2,4]
obstacles = [[2,4]]
solution=Solution()
res=solution.robotSim(commands,obstacles)
print(res)