[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でいい.
    注意事項
  • インデックスが問題で[3,4]であってもコンピュータはゼロから始まるので[2,3]は
  • である.
  • 方向の長さは4で、その中で回転する時範囲を超えないように注意します
    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)