[BOJ]#3190 BamPython
質問する
https://www.acmicpc.net/problem/3190
「Dummy」というドスゲームがありました.このゲームには蛇が這い出していて、りんごを食べると蛇の長さが増えます.ヘビが這い回って、壁や自分の体にぶつかって、ゲームは終わりました.
ゲームはNxN正方形の碁盤で行われ、一部の格にはりんごが置かれている.板の上下左右端に壁があります.ゲーム開始時、ヘビは一番上の一番左側にあり、ヘビの長さは1です.蛇は最初は右です.
ヘビは毎秒移動し、次のルールに従います.
入力
最初の行は、プレートのサイズNを与える.(2≦N≦100)次の行はリンゴの個数Kを与える.(0 ≤ K ≤ 100)
次のK行はリンゴの位置を示し,1番目の整数は行を表し,2番目の整数は列の位置を表す.りんごの位置が違います.一番上の左側(1行1列)にはりんごがありません.
次の行は蛇の方向転換回数Lを与える.(1 ≤ L ≤ 100)
以下のL行は蛇の方向変換情報を提供し,整数Xと文字Cからなる.ゲーム開始時間からX秒終了後に左(Cは「L」)または右(Cは「D」)に90度回転します.Xは10000以下の正の整数であり、方向変換情報はXが増加する順に与えられる.
しゅつりょく
1行目の出力ゲームは数秒で終了します.
アイデア
瓇sという名前のdequeに最初の蛇の位置[0,0]を入れて所定の方向に移動します.壁や蛇にぶつからなければ、前進を続けます.移動する位置にりんごがあればそこに置いてありますが、なければ一番前のインデックスを外します.方向変換情報を受け取ると、所定の方向に回転します.
勘定科目の方向の回転
上図のように時計回り(右折)は赤、反時計回り(左折)は青、右折と左折は方向が違うだけです.
そのため、👍 direction=[0,1],[1,0],[0,1],[-1,0].
最初は右に移動していたので[0,1]でスタート.
「D」は右折、idx+=1、「L」は左折、idx-=1である.
✔¥コード説明
1.指定された入力を受信して保存します.
2.回転コマンドを1つずつ出して使うのでdequeで受け取ります.
3.directionは上記のように設定します.
4.時間は最初は0であり、s(Bam)は[0,0]から始まる.ヘビも動くのでdequeにしておくと便利です.
5、t、dは、1回転分の時間と回転方向を減算して記憶される.
6.idxはdirectionのインデックス0で開始します.(右)
7.方向に移動した場合、所定の範囲を超えなければ続行します.
8.x,yはsが蛇の体であり、ない場合にのみ行われる.
9.sに増やし、時間を増やします.
10.移動する位置にリンゴがある場合はその場に置き、リンゴがない場合は長さが長くならないので1つ残します.
11.コマンド時間になると、指定した方向に回転します.
12.この場合、方向の範囲を超えないように注意してください.
13.求めた時間に+1でいい.
注意事項
1行目の出力ゲームは数秒で終了します.
アイデア
瓇sという名前のdequeに最初の蛇の位置[0,0]を入れて所定の方向に移動します.壁や蛇にぶつからなければ、前進を続けます.移動する位置にりんごがあればそこに置いてありますが、なければ一番前のインデックスを外します.方向変換情報を受け取ると、所定の方向に回転します.
勘定科目の方向の回転
上図のように時計回り(右折)は赤、反時計回り(左折)は青、右折と左折は方向が違うだけです.
そのため、👍 direction=[0,1],[1,0],[0,1],[-1,0].
最初は右に移動していたので[0,1]でスタート.
「D」は右折、idx+=1、「L」は左折、idx-=1である.
✔¥コード説明
1.指定された入力を受信して保存します.
2.回転コマンドを1つずつ出して使うのでdequeで受け取ります.
3.directionは上記のように設定します.
4.時間は最初は0であり、s(Bam)は[0,0]から始まる.ヘビも動くのでdequeにしておくと便利です.
5、t、dは、1回転分の時間と回転方向を減算して記憶される.
6.idxはdirectionのインデックス0で開始します.(右)
7.方向に移動した場合、所定の範囲を超えなければ続行します.
8.x,yはsが蛇の体であり、ない場合にのみ行われる.
9.sに増やし、時間を増やします.
10.移動する位置にリンゴがある場合はその場に置き、リンゴがない場合は長さが長くならないので1つ残します.
11.コマンド時間になると、指定した方向に回転します.
12.この場合、方向の範囲を超えないように注意してください.
13.求めた時間に+1でいい.
注意事項
ex) direction[5] = direction[1]
マイコードpython from collections import deque
n = int(input())
k = int(input())
apple = [list(map(int, input().split())) for x in range(k)]#사과 위치
l = int(input())
order = deque([list(input().split()) for x in range(l)])#회전 명령
direction = [[0,1], [1, 0], [0,-1],[-1,0]]
time = 0
s = deque([[0, 0]])
t, d = order.popleft() #시간, 회전 방향
idx = 0 #방향(direction)은 오른쪽 부터 시작이므로 0번부터 시작, 오른쪽 회전은 +1, 왼쪽 회전은 -1
while 0 <= s[-1][0]+direction[idx][0] < n and 0 <= s[-1][1]+direction[idx][1] < n:
x = s[-1][0]+direction[idx][0]
y = s[-1][1]+direction[idx][1]
if [x, y] not in s:
s.append([x, y])
time += 1
if [x+1, y+1] in apple:
apple.remove([x+1,y+1])
else:
s.popleft()
if time == int(t):
if d == 'L':
idx = (idx - 1) % 4
elif d == 'D':
idx = (idx + 1) % 4
if len(order) > 0:
t, d = order.popleft()
else:
break
print(time+1)
Reference
この問題について([BOJ]#3190 BamPython), 我々は、より多くの情報をここで見つけました
https://velog.io/@guswl8280/BOJ-3190-뱀-Python
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
from collections import deque
n = int(input())
k = int(input())
apple = [list(map(int, input().split())) for x in range(k)]#사과 위치
l = int(input())
order = deque([list(input().split()) for x in range(l)])#회전 명령
direction = [[0,1], [1, 0], [0,-1],[-1,0]]
time = 0
s = deque([[0, 0]])
t, d = order.popleft() #시간, 회전 방향
idx = 0 #방향(direction)은 오른쪽 부터 시작이므로 0번부터 시작, 오른쪽 회전은 +1, 왼쪽 회전은 -1
while 0 <= s[-1][0]+direction[idx][0] < n and 0 <= s[-1][1]+direction[idx][1] < n:
x = s[-1][0]+direction[idx][0]
y = s[-1][1]+direction[idx][1]
if [x, y] not in s:
s.append([x, y])
time += 1
if [x+1, y+1] in apple:
apple.remove([x+1,y+1])
else:
s.popleft()
if time == int(t):
if d == 'L':
idx = (idx - 1) % 4
elif d == 'D':
idx = (idx + 1) % 4
if len(order) > 0:
t, d = order.popleft()
else:
break
print(time+1)
Reference
この問題について([BOJ]#3190 BamPython), 我々は、より多くの情報をここで見つけました https://velog.io/@guswl8280/BOJ-3190-뱀-Pythonテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol