https://www.acmicpc.net/problem/19236
"""
"""
import copy
pan = [ [] for _ in range(4) ]
answer = 0
for i in range(4):
tmp = list(map(int, input().split()))
fish = []
for j in range(0, 8, 2):
fish.append([tmp[j], tmp[j+1]-1]) # 방향은 -1 해서 입력
pan[i] = fish
dx = [-1, -1, 0, 1, 1, 1, 0, -1]
dy = [0, -1, -1, -1, 0, 1, 1, 1]
answer = 0
def dfs(sx, sy, score, pan):
global answer
score += pan[sx][sy][0] # 상어가 먹은 물고기의 번호
answer = max(answer, score)
pan[sx][sy][0] = 0 # 물고기가 잡아 먹힌곳은 0으로 표시
# 물고기의 이동
for f in range(1, 16+1):
f_x, f_y = -1, -1
for x in range(4):
for y in range(4):
if pan[x][y][0] == f: # 믈고기를 찾으면 좌표 저장 후 바로 탈출
f_x, f_y = x, y
break
if f_x == -1 and f_y == -1: # 물고기가 잡아 먹힌 경우는 다음 물고기로 넘어감
continue
f_d = pan[f_x][f_y][1]
for i in range(8): # 물고기 방향 돌리기
md = (f_d + i) % 8
mx = f_x + dx[md]
my = f_y + dy[md]
if not (0 <= mx < 4 and 0 <= my < 4) or (mx == sx and my == sy): # 범위를 벗어나거나 상어를 만나면 stop
continue
pan[mx][my], pan[f_x][f_y] = pan[f_x][f_y], pan[mx][my] # 45도 반시계 방향으로 돌리고 이동이 가능하면 좌표를 바꾸고 stop
pan[mx][my][1] = md # 방향 업데이트
break
# 상어의 이동
s_d = pan[sx][sy][1]
for i in range(1, 5):
mx = sx + dx[s_d] * i # (0, 0)에서 우측을 본다면 (0, 1), (0, 2), (0, 3) 다 갈 수 있도록 설정
my = sy + dy[s_d] * i
if (0 <= mx < 4 and 0 <= my < 4) and pan[mx][my][0] > 0:
dfs(mx, my, score, copy.deepcopy(pan))
dfs(0, 0, 0, pan)
print(answer)
DFS + 구현 문제