https://www.acmicpc.net/problem/3190

 

3190번: 뱀

문제  'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다.

www.acmicpc.net



Solution

from collections import deque

# 동남서북
dx = [1, 0, -1, 0] # r
dy = [0, 1, 0, -1] # c

def dummy(board, change_dir):
    snake_head = (1,1)
    direction = 0
    time = 0
    board[snake_head[0]][snake_head[1]] = 2
    # (c, r)
    q = deque()
    q.append(snake_head)
    while True:
        #print(q, time, direction)
        nx = snake_head[1] + dx[direction]
        ny = snake_head[0] + dy[direction]
        if nx >= 1 and ny >= 1 and nx <= n and ny <= n and board[ny][nx] != 2:
            # 사과가 없을 경우
            if board[ny][nx] == 0:
                snake_head = (ny, nx)
                board[ny][nx] = 2
                q.append(snake_head)
                y,x = q.popleft()
                board[y][x] = 0
            # 사과가 있을 경우
            else:
                snake_head = (ny, nx)
                board[ny][nx] = 2
                q.append(snake_head)
            time += 1
            for i in change_dir:
                if time == i[0]:
                    direction = turn(direction, i[1])
        else:
            print(time+1)
            break
        
def turn(direction, c):
    if c == 'L':
        direction = (direction - 1) % 4
    else:
        direction = (direction + 1) % 4
        
    return direction

n = int(input())
k = int(input())

# (c, r)
apple = []
for i in range(k):
    input_data = list(map(int, input().split(' ')))
    apple.append(input_data)
    
l = int(input())

change_dir = []
for i in range(l):
    input_data = input().split(' ')
    change_dir.append((int(input_data[0]), input_data[1]))

board = [[0 for i in range(n+1)] for i in range(n+1)]
for i in range(n+1):
    for j in range(n+1):
        if [i, j] in apple:
            board[i][j] = 1
            
dummy(board, change_dir)

 

구현 문제.

snake_head로 뱀의 머리의 좌표를 담아두고, 큐를 하나 만들어 board에 있는 뱀의 전체 몸 위치를 관리한다. 뱀이 움직였을 때 사과가 있을 때에는 큐에 뱀의 머리 부분을 담고, board에 뱀이 있다는 표시를 해둔다.

 

# 사과가 있을 경우
else:
    snake_head = (ny, nx)
    board[ny][nx] = 2
    q.append(snake_head)

 

사과가 없을 경우에는 사과가 있을 경우와 같지만, 뱀의 몸길이가 짧아지므로 큐에서 가장 처음에 들어왔던 부분을 제거해주고 board에 뱀이 있다는 표시인 2를 다시 0으로 바꿔준다.

 

# 사과가 없을 경우
if board[ny][nx] == 0:
    snake_head = (ny, nx)
    board[ny][nx] = 2
    q.append(snake_head)
    y,x = q.popleft()
    board[y][x] = 0

 

그리고 시간을 1초씩 증가를 시키는데, 방향 전환을 해야될 때가 오면 turn함수에 현재 방향과 전환할 방향을 넘겨주고 방향을 바꾼다.

 

time += 1
    for i in change_dir:
    if time == i[0]:
    	direction = turn(direction, i[1])

 

 

 

 


생강강

,