n, m, k = map(int, input().split())
shark = [(-1, -1)] * (m + 1)
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
g = [list(map(int, input().split())) for _ in range(n)]
smell = [[[0, 0]] * n for _ in range(n)]
now_dir = [0] + list(map(int, input().split()))
# 격자의 상어 shark 에 저장
for i in range(n):
for j in range(n):
if g[i][j] != 0:
shark[g[i][j]] = (i, j)
# 방향 우선 순위 입력
case = [[[0]* 4 for _ in range(4)] for _ in range(m)]
for i in range(m):
for j in range(4):
case[i][j] = list(map(int, input().split()))
# 초기 상어 위치에 냄새
for i in range(1, len(shark)):
x, y = shark[i]
smell[x][y] = [i, k]
# 냄새 감소와 g에 상어 있으면 냄새 추가
def smelloperation(g, smell):
for u in range(n):
for v in range(n):
# 냄새 남은 시간이 0 보다 크면 1개 감소시킴
if smell[u][v][1] > 0:
smell[u][v][1] -= 1
# 만약 상어가 그 자리에 왔으면 냄새 추가
if g[u][v] != 0:
smell[u][v] = [g[u][v], k]
return
def move(shark, g, now_dir, smell):
# 먼저 방향 설정해줌 now_dir 바꿔준다
for i in range(1, m+1):
# 이미 격자에서 나간 상어
if shark[i] == (-1, -1):
continue
findnosmell = False
x, y = shark[i]
# 우선순위에 따라 방향 설정
for d in range(4):
nx, ny = x + dx[case[i-1][now_dir[i] - 1][d] - 1], y + dy[case[i-1][now_dir[i] - 1][d] - 1]
if nx < 0 or ny < 0 or nx >= n or ny >= n:
continue
# 냄새가 없는 곳 찾음. 방향 정했음
if smell[nx][ny][1] == 0:
now_dir[i] = case[i-1][now_dir[i] - 1][d]
findnosmell = True
break
# 냄새 없는 곳 못 찾아서 내 냄새 있는 곳을 찾아감
if findnosmell == False:
for d in range(4):
nx, ny = x + dx[case[i-1][now_dir[i] - 1][d] - 1], y + dy[case[i-1][now_dir[i] - 1][d] - 1]
if nx < 0 or ny < 0 or nx >= n or ny >= n:
continue
if smell[nx][ny][0] == i:
now_dir[i] = case[i-1][now_dir[i] - 1][d]
break
# 정해진 방향대로 상어 이동
for i in range(1, m+1):
# 이미 격자를 나간 상어는 무시
if shark[i] == (-1, -1):
continue
# 방향대로 상어 이동
x, y = shark[i]
d = now_dir[i]
shark[i] = (x + dx[d - 1], y + dy[d - 1])
# 중복 상어 처리
for i in range(1, m+1):
for j in range(i+1, m+1):
# 상어 위치가 겹치면 뒤에 상어(번호가 큰 상어)는 내보냄
if shark[i] == shark[j]:
shark[j] = (-1, -1)
# 최종 상어 위치를 g에 넣어줌
g = [[0] * n for _ in range(n)]
for i in range(1, m+1):
if shark[i] == (-1, -1):
continue
x, y = shark[i]
g[x][y] = i
return shark, g, now_dir, smell
t = 0
while True:
smelloperation(g, smell)
shark, g, now_dir, smell = move(shark, g, now_dir, smell)
t += 1
loopout = True
for i in range(2, m+1):
if shark[i] != (-1, -1):
loopout = False
break
if t > 1000:
t = -1
loopout = True
if loopout:
print(t)
break
인덱스 문제로 헷갈려서 오래걸림...
마지막 루프 빠져 나올 때 t >= 1000 으로 했다가 틀려서 힘들었음...
1000번째까지 냄새퍼지고, 이동 가능하고 10001번째는 모든 이동을 끝내도 결과를 낼 수 없음