문제
2048 게임의 개발자는 신상 게임기를 사느라 이번 달 월급을 모두 사용하였다. 다음 월급 날까지 날짜가 한참 남아 돈을 아껴야하지만 더운 날씨에 시원한 아이스 아메리카노가 마시고 싶다.
개발자는 2048 게임을 이용해 친구와 커피 내기에서 승리하여 커피를 얻어마시려고 한다.
기존의 2048 게임은 한 판을 하는데 시간이 너무 오래 걸려 빠른 승부를 위해 게임을 약간 변형시켰다고 한다.
-변형된 2048 게임은 보드의 크기가 N×N 이다.
-한 번의 이동은 보드 위에 있는 전체 블록을 상하좌우 네 방향 중 하나로 이동시키는 것이다.
-이때, 같은 값을 갖는 두 블록이 충돌하면 두 블록은 하나로 합쳐지게 된다. 한 번의 이동에서 이미 합쳐진 블록은 또 다른 블록과 다시 합쳐질 수 없다.
-한번의 이동마다 새로운 블록이 추가되지는 않는다.
-최대 5번 이동을 시켜서 가장 큰 숫자의 블록을 만드는 사람이 승리한다.
보드의 크기와 보드판의 블록이 주어질 때 최대 5번 이동시켜 만들 수 있는 가장 큰 숫자를 구해 개발자가 내기에서 승리할 수 있도록 도와주는 프로그램을 작성하시오.
입력
첫째 줄에 보드의 크기 N (1 ≤ N ≤ 20)이 주어진다.
둘째 줄부터 N개의 줄에는 게임판의 초기 상태가 주어진다. 0은 빈 칸을 나타내며, 이외의 값은 모두 블록을 나타낸다.
블록에 쓰여 있는 수는 2보다 크거나 같고, 1024보다 작거나 같은 2의 제곱꼴이다.
블록은 적어도 하나 주어진다.
출력
최대 5번 이동시켜서 얻을 수 있는 가장 큰 블록을 출력한다.
예제
3
2 2 2
4 4 4
8 8 8
16