[BOJ]3190ヘビ-サムスンソフトウェア能力試験機
https://www.acmicpc.net/problem/3190
問題の概要ヘビは体長を増やすことで、頭を次の格子に位置決めします. 移動した格子の中にリンゴがあれば、格子の中のリンゴは消え、しっぽも動かない. 移動した格子にリンゴがなければ、体の長さを短くして尻尾のある格子を空けます.つまり、身長は変わらない. リンゴの位置と蛇の移動経路が与えられると、このゲームは数秒で終了する. 方法
1.ヘビ座標を保存するdeque-一番前の値は末尾(最初に追加した値であるため)、一番後ろの値は頭
2.bfs回転時に次のセルに配置する座標、方向、時間キューに追加
-この時点が反転方向の時間であれば、反転方向(dy、dxインデックスに調整)
3.行き先にリンゴがある場合は、リンゴを食べ、頭部座標、尻尾座標popxを加える
4.リンゴがなければ、頭部座標と末尾座標popleftのみを追加
5.次に行く場所が壁かもう自分の体だったら、時間に戻る
問題の概要
1.ヘビ座標を保存するdeque-一番前の値は末尾(最初に追加した値であるため)、一番後ろの値は頭
2.bfs回転時に次のセルに配置する座標、方向、時間キューに追加
-この時点が反転方向の時間であれば、反転方向(dy、dxインデックスに調整)
3.行き先にリンゴがある場合は、リンゴを食べ、頭部座標、尻尾座標popxを加える
4.リンゴがなければ、頭部座標と末尾座標popleftのみを追加
5.次に行く場所が壁かもう自分の体だったら、時間に戻る
# BOJ 3190 뱀 [삼성 SW 역량 테스트 기출] - 김수민 (40분)
from collections import deque
dy = [0, 1, 0, -1]
dx = [1, 0, -1, 0]
def bfs():
while tmp:
y, x, time, dir = tmp.popleft()
ny = y + dy[dir]
nx = x + dx[dir]
# 벽에 부딪히거나 새로 이동할 곳에 자기 몸이 있으면 걸린 시간 리턴(이동 예정인 좌표니까 시간 + 1 해줌)
if ny < 0 or ny >= N or nx < 0 or nx >= N:
return time + 1
if ((ny, nx)) in snake:
return time + 1
# 방향이동시간이면 방향 바꿔준다. dy, dx가 시계방향 순서이므로 왼,오에 따라 인덱스 조절
if Q:
if time + 1 == int(Q[0][0]):
t, d = Q.popleft()
if d == 'D':
dir = (dir + 1) % 4
elif d == 'L':
dir = (dir + 3) % 4
snake.append((ny, nx)) # 뱀
if arr[ny][nx] != 1: # 사과 없으면
snake.popleft() # 꼬리떼기
elif arr[ny][nx] == 1: # 사과 먹으면
arr[ny][nx] = 0 # 사과부분 0으로
tmp.append((ny, nx, time + 1, dir))
N = int(input())
K = int(input())
arr = [[0] * N for _ in range(N)]
for k in range(K):
y, x = map(int, input().split())
arr[y-1][x-1] = 1
Q = deque() # 방향 전환
tmp = deque() # 새로 이동할 뱀의 머리 부분 (y좌표, x좌표, 시간, 방향) 담음
snake = deque() # 뱀의 몸에 해당되는 좌표 담음
L = int(input())
snake.append((0,0))
for l in range(L):
t, dir = input().split()
Q.append((t, dir))
tmp.append((0,0,0,0))
print(bfs())
Reference
この問題について([BOJ]3190ヘビ-サムスンソフトウェア能力試験機), 我々は、より多くの情報をここで見つけました https://velog.io/@smkim104/BOJ-3190-뱀-삼성-SW-역량-테스트-기출テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol