import sys
input = sys.stdin.readline
dy = [-1,1,0,0]
dx = [0,0,-1,1]
def smellup():
global finish
cnt = 0
for i in range(N):
for j in range(N):
if ocean[i][j]:
smell[i][j] = [k,ocean[i][j]]
cnt += 1
if cnt == 1:
finish = True
def smelldown():
for i in range(N):
for j in range(N):
if smell[i][j][0]:
smell[i][j][0] -= 1
def moveshark():
newocean = [[0]*N for i in range(N)]
for y in range(N):
for x in range(N):
if ocean[y][x]:
n = ocean[y][x]
moved = False
for d in priority[n][direction[n]]:
y1,x1 = y+dy[d],x+dx[d]
if not (N>y1>=0 and N>x1>=0) or smell[y1][x1][0]:
continue
moved = True
direction[n] = d
break
if not moved:
for d in priority[n][direction[n]]:
y1,x1 = y+dy[d],x+dx[d]
if not (N>y1>=0 and N>x1>=0) or smell[y1][x1][1] != n:
continue
direction[n] = d
break
if newocean[y1][x1] and n > newocean[y1][x1]:
continue
newocean[y1][x1] = n
return newocean
N,M,k = map(int,input().split())
ocean = []
for i in range(N):
ocean.append([*map(int,input().split())])
direction = [0]
direction.extend(map(lambda x:x-1,map(int,input().split())))
priority = [[] for i in range(M+1)]
for n in range(1,M+1):
for i in range(4):
priority[n].append([*map(lambda x:x-1,map(int,input().split()))])
smell = [[[0,0] for i in range(N)] for i in range(N)]
finish = False
for result in range(1001):
smellup()
if finish:
break
ocean = moveshark()
smelldown()
if finish:
print(result)
else:
print(-1)
오늘도 재미있는(?) 구현문제
상어시리즈를 포함한 구현문제가 늘 그렇듯 코드 난이도는 쉽고, 시간은 오래걸린다.
긴 구현문제를 풀면 항상 오타가 나오는걸 고쳐야할 것 같다.
오늘의 교훈) 오타 주의!