import sys
sys.stdin = open("input.txt", "rt")
n = int(input())
g = [list(map(int, input().split())) for _ in range(n)]
def move(g): # ! 해당 보드 왼쪽으로 밀기
temp = [[0] * n for _ in range(n)]
for i in range(n):
flag = False # ! 연속 갱신 x -> 이전에 갱신이 있었는지 없었는지 확인하기 위해
pos = -1 # ! 현재 조작 위치 (타겟점)
for j in range(n):
if g[i][j] == 0: continue # 값이 없으면 무시
if flag == True and g[i][j] == temp[i][pos]: # ! 한번 값이 옮겨졌었고(flag == True) and 내가 지금 옮기려는 값과 지도에 옮겨져 있는 값이 같으면 업데이트
flag = False # ! 값이 합쳐졌다는 소리
temp[i][pos] *= 2
else:
pos += 1
temp[i][pos] = g[i][j] # ! 아니라면 값만 복사
flag = True
return temp
def rotate_90(g):
temp = [[0] * n for _ in range(n)]
for i in range(n):
for j in range(n):
temp[j][n-i-1] = g[i][j]
return temp
MAX_VAL = -int(1e9)
def DFS(L, g):
global MAX_VAL
if L == 5:
maxData = 0
for i in range(n):
temp = max(g[i])
maxData = max(maxData, temp)
MAX_VAL = max(MAX_VAL, maxData)
else:
for i in range(4):
temp_g = move(g)
DFS(L+1, temp_g)
g = rotate_90(g)
DFS(0,g)
print(MAX_VAL)
각 방향으로 이동 시 보드의 숫자 변화를 어떻게 처리할 것인가 ?
-> 위 질문을 생각해 봤어야 했다.
상하좌우 4개의 함수를 따로 처리해도 된다.
하지만 !! 어느 한 방향만 구현하고, 90도 돌리는 함수를 구현하면 됐다.
즉 다시 말하면,
기존 보드를 -> 밀면 오른쪽으로 민 것이다.
근데 기존 보드를 시계 방향으로 90도 회전 후 오른쪽으로 밀면 아래로 미는 것을 구현할 수 있다.
즉 한가지 방향만 구현하면 된다.
다시 생각하면, 각 방향으로 이동 시 보드의 숫자 변화를 어떻게 처리할 것인가 ? : 이 부분에 대해서 자세히 생각했어야 했음.
무엇보다도 move함수 구현 시뮬레이션 해보면서 생각해봤어야 했다.