BOJ 3190. ヘビ(Python)


BOJ 3190. ヘビ(Python)


質問リンク
問題の説明
「Dummy」というドスゲームがありました.このゲームには蛇が這い出していて、りんごを食べると蛇の長さが増えます.ヘビが這い回って、壁や自分の体にぶつかって、ゲームは終わりました.
ゲームはNxN正方形の碁盤で行われ、一部の格にはりんごが置かれている.板の上下左右端に壁があります.ゲーム開始時、ヘビは一番上の一番左側にあり、ヘビの長さは1です.蛇は最初は右です.
ヘビは毎秒移動し、次のルールに従います.
まず、蛇は体の長さを伸ばして、頭を次の節に位置させます.
移動する格子の中にりんごが入っていれば、格子の中のりんごはなくなり、しっぽが動かなくなります.
動く格子にリンゴがなければ、体長を縮めて尻尾のある格子を出す.つまり、身長は変わらない.
リンゴの位置と蛇の移動経路を与えると,このゲームは数秒で終了する.
I/O例


ソリューション
  • の要求に従って実施すればよい.蛇の胴体を列に入れ、時間に応じて回転して移動して並べます.(modによる回転が便利)
  • りんごを食べるときは行列の要素を保ち、りんごがないときはしっぽを外して移動します.
  • コード#コード#
    from collections import deque
    # import sys
    # sys.stdin = open('input.txt')
    
    N = int(input())
    K = int(input())
    arr = [[0] * N for _ in range(N)]
    for _ in range(K):
        x, y = map(int, input().split())
        arr[x - 1][y - 1] = 1
    L = int(input())
    # 오른, 아래, 왼, 위, 명령에 따라 좌회전 또는 우회전을 하기 때문에 mod로 구현하고자 key값을 0~3으로 구성함
    delta = {0:(0, 1), 2:(0, -1), 1:(1, 0), 3:(-1, 0)}
    # 처음 시작 방향이 오른쪽
    direction = 0
    time = 0
    change = {}
    for _ in range(L):
        t, action = input().split()
        change[int(t)] = action
    x, y = 0, 0
    snake = deque([(0,0)])
    # delta에 따라 뱀의 머리를 이동시키고 사과가 있다면 그대로 진행
    # 사과가 없다면 꼬리를 제거한다.
    while True:
        time +=1
        dx, dy = delta[direction]
        x+=dx
        y+=dy
        # 시간에 따른 방향 전환
        if time in change.keys():
            if change[time] == 'L':
                direction = (direction - 1) % 4
            else:
                direction = (direction + 1) % 4
        # 벽에 부딪친 경우
        if x < 0 or x >= N or y < 0 or y >= N:
            break
        # 자신의 몸통에 부딪친 경우
        if [x, y] in snake:
            break
        # 사과를 먹은 경우
        if arr[x][y] == 1:
            arr[x][y] = 0
            snake.append([x, y])
        # 사과가 없는 경우
        else:
            snake.append([x,y])
            # 꼬리 제거
            snake.popleft()
    print(time)