20251213
import sys
input = sys.stdin.readline
N = int(input())
global_ans = 0
board = []
for _ in range(N):
board.append(list(map(int, input().split())))
def merged(line): #왼쪽으로 움직여서 병합함
arr = [x for x in line if x != 0]
changed = []
i = 0
while i < len(arr):
if i + 1 < len(arr) and arr[i] == arr[i + 1]:
changed.append(arr[i] * 2)
i += 2
else:
changed.append(arr[i])
i += 1
changed += [0] * (len(line) - len(changed))
return changed
def move_left(bd):
new = [row[:] for row in bd]
changed = False
for i in range(N):
line = new[i]
mgd_line = merged(line)
if line != mgd_line:
changed = True
new[i] = mgd_line
return new if changed else None
def move_right(bd):
new = [row[:] for row in bd]
changed = False
for i in range(N):
orginal = new[i]
rev = orginal[::-1]
mgd_line = merged(rev)[::-1]
if orginal != mgd_line:
changed = True
new[i] = mgd_line
return new if changed else None
def move_up(bd):
new = [row[:] for row in bd]
changed = False
for j in range(N):
line = [new[i][j] for i in range(N)]
mgd_line = merged(line)
if line != mgd_line:
changed = True
for i in range(N):
new[i][j] = mgd_line[i]
return new if changed else None
def move_down(bd):
new = [row[:] for row in bd]
changed = False
for j in range(N):
original = [new[i][j] for i in range(N)]
mgd_line = merged(original[::-1])[::-1]
if original != mgd_line:
changed = True
for i in range(N):
new[i][j] = mgd_line[i]
return new if changed else None
def move(bd, mode):
if mode == 0:
return move_up(bd)
elif mode == 1:
return move_down(bd)
elif mode == 2:
return move_left(bd)
else:
return move_right(bd)
def dfs(board: list, depth: int): #dfs함수
global global_ans
max_tile = 0
for row in board:
max_tile = max(max_tile, max(row))
global_ans = max(global_ans, max_tile)
if depth == 10:
return
if max_tile (2 * (10 - depth)) <= global_ans:
return
for k in range(4):
nxt = move(board, k)
if nxt is None:
continue
dfs(nxt, depth + 1)
dfs(board, 0)
print(global_ans)

