N = int(input())
block = []
for i in range(N):
block.append(list(map(int, input().split(' '))))
def cpy_block(src_block):
dest_block = []
for i in range(N):
tmp = []
for j in range(N):
tmp.append(src_block[i][j])
dest_block.append(tmp)
return dest_block
def move(block, direction):
if direction == 0:
for i in range(N):
end = N-1
for j in range(N-2, -1, -1):
if block[i][j]:
value = block[i][j]
block[i][j] = 0
if block[i][end] == 0:
block[i][end] = value
elif block[i][end] == value:
block[i][end] = value * 2
end -= 1
elif block[i][end] != value:
end -= 1
block[i][end] = value
elif direction == 1:
for i in range(N):
end = 0
for j in range(1, N):
if block[i][j]:
value = block[i][j]
block[i][j] = 0
if block[i][end] == 0:
block[i][end] = value
elif block[i][end] == value:
block[i][end] = value * 2
end += 1
elif block[i][end] != value:
end += 1
block[i][end] = value
elif direction == 2:
for j in range(N):
end = N-1
for i in range(N-2, -1, -1):
if block[i][j]:
value = block[i][j]
block[i][j] = 0
if block[end][j] == 0:
block[end][j] = value
elif block[end][j] == value:
block[end][j] = value * 2
end -= 1
elif block[end][j] != value:
end -= 1
block[end][j] = value
elif direction == 3:
for j in range(N):
end = 0
for i in range(1, N):
if block[i][j]:
value = block[i][j]
block[i][j] = 0
if block[end][j] == 0:
block[end][j] = value
elif block[end][j] == value:
block[end][j] = value * 2
end += 1
elif block[end][j] != value:
end += 1
block[end][j] = value
return block
def dfs(block, cnt):
global result
if cnt == 5:
for i in range(N):
for j in range(N):
result = max(result, block[i][j])
return
for i in range(4):
block_cpyed = cpy_block(block)
block_moved = move(block_cpyed, i)
dfs(block_moved, cnt + 1)
result = 0
dfs(block, 0)
print(result)
- dfs를 이용해서 left, right, down, up 하는 경우를 각각 탐색함
- recursion으로 dfs를 구현함
- 4방향, 총 5번 이동 (4 ^ 5 = 1024의 경우)
- 모든 방향 탐색을 마친 후 (cnt가 5일 때), block에서 최댓값을 찾아, 전역변수 ans를 max값으로 갱신해줌
- 각 방향 별로 이동하는 경우를 나누어 move 함수를 구현함
- 각 방향마다 총 3가지의 경우가 존재함
1) 맨 끝의 위치가 0인 경우
2) 맨 끝의 값과 그 전의 값이 같은 경우
3) 맨 끝의 값과 그 전의 값이 다른 경우
- aliasing이 아닌, value를 복사해 주기 위해 cpy_block 함수를 구현함