#問題
マップの行数 H と列数 W ,障害物を # で移動可能な場所を . で表した H 行 W 列のマップ S_1 ... S_H ,現在の座標 sy, sx, 移動の回数 N が与えられます。
プレイヤーははじめ北を向いています。
続けて、 N 回の移動の向き d_1 ... d_N と移動するマス数 l_1 ... l_N が与えられます。
各移動が可能である場合、移動後の y , x 座標 を出力してください。
移動しきれない場合、移動できるところまで移動した後の座標を出力した後に "Stop" を出力して、以降の移動を打ち切ってください。
移動可能であるということは、以下の図の通り
「今いるマスから移動先のマスまでの間の全てのマスが移動可能である かつ 移動先がマップの範囲外でない」 ということを意味します。
なお、マスの座標系は左上端のマスの座標を ( y , x ) = ( 0 , 0 ) とし、
下方向が y 座標の正の向き、右方向が x 座標の正の向きとします。
#つまづいた所
"#"が途中で出てくる場合の処理
与えられた数値を元にスライスしたり、numpy使おうとしたり苦戦。
完全に複雑に考えすぎていた。
最終的にfor文で1座標ずつ処理して行った。
もちろん一番最初にfor文を試してはいたが、breakの処理や場所を勘違いしてたり、一分岐ごとにわざわざ出力してたりと遠回りに遠回りに可笑しな方向に行ってしまった。
また、枠からはみ出るかつ、途中で"#"が出てくる場合の処理が抜けていた。
#コード
h,w,y,x,n = [int(i) for i in input().split()]
board = [list(input()) for i in range(h)]
direction = "N"
stop = False
for i in range(n):
a,b = input().split()
b = int(b)
#北向
if direction == "N":
#右方向
if a == "R":
direction = "E"
if x+b >= w:
for i in range(x,w):
x += 1
if board[y][x] == "#":
x -= 1
break
stop = True
else:
for i in range(b):
x += 1
if board[y][x] == "#":
x -= 1
stop = True
break
#左方向
else:
direction = "W"
if x - b < 0:
for i in range(0,x):
x -= 1
if board[y][x] == "#":
x += 1
break
stop = True
else:
for i in range(b):
x -= 1
if board[y][x] == "#":
x += 1
stop = True
break
#南向き
elif direction == "S":
#右方向
if a == "R":
direction = "W"
if x - b < 0:
for i in range(0,x):
x -= 1
if board[y][x] == "#":
x += 1
break
stop = True
else:
for i in range(b):
x -= 1
if board[y][x] == "#":
x += 1
stop = True
break
#左方向
else:
direction = "E"
if x+b >= w:
for i in range(x,w):
x += 1
if board[y][x] == "#":
x -= 1
break
stop = True
else:
for i in range(b):
x += 1
if board[y][x] == "#":
x -= 1
stop = True
break
#東向き
elif direction == "E":
#右方向
if a == "R":
direction = "S"
if y + b >= h:
for i in range(y,h):
y += 1
if board[y][x] == "#":
y -= 1
break
stop = True
else:
for i in range(b):
y += 1
if board[y][x] == "#":
y -= 1
stop = True
break
#左方向
else:
direction = "N"
if y - b < 0:
for i in range(0,y):
y -= 1
if board[y][x] == "#":
y += 1
break
stop = True
else:
for i in range(b):
y -= 1
if board[y][x] == "#":
y += 1
stop = True
break
#西向き
else:
#右方向
if a == "R":
direction = "N"
if y - b < 0:
for i in range(0,y):
y -= 1
if board[y][x] == "#":
y += 1
break
stop = True
else:
for i in range(b):
y -= 1
if board[y][x] == "#":
y += 1
stop = True
break
#左方向
else:
direction = "S"
if y + b >= h:
for i in range(y,h):
y += 1
if board[y][x] == "#":
y -= 1
break
stop = True
else:
for i in range(b):
y += 1
if board[y][x] == "#":
y -= 1
stop = True
break
if stop == True:
print(y,x)
print("Stop")
break
else:
print(y,x)
#結果
与えられる入力を全て開いてるのが試行錯誤の跡。
一回諦めたけど悔しくて悔しくて笑
東西南北と右左で8通りの分岐はあるものの、結局は4パターンの処理なので思考的な負荷はコードの半分くらい。
向き合って正解でした🙆♂️