#include<bits/stdc++.h>
#define MAX 21
using namespace std;
int N, ans;
int Map[MAX][MAX];
int cMap[MAX][MAX];
int sel[5];
bool flag;
void copyMap(){
for(int i = 0; i < N; i++){
for(int j = 0; j < N; j++){
cMap[i][j] = Map[i][j];
}
}
}
void moveRight(){
for(int i = 0; i < N; i++){
for(int j = N-1; j > 0; j--){
flag = false;
if(cMap[i][j]==0){
int k = j-1;
while(k>=0){
if(cMap[i][k] != 0){
flag = true;
break;
}
k--;
}
if(flag){
cMap[i][j] = cMap[i][k];
cMap[i][k] = 0;
}
}
}
}
}
void mergeRight(){
for(int i = 0; i < N; i++){
for(int j = N-1; j > 0; j--){
if(cMap[i][j]==cMap[i][j-1]){
cMap[i][j] *= 2;
cMap[i][j-1] = 0;
}
}
}
}
void right(){
moveRight();
mergeRight();
moveRight();
}
void moveLeft(){
for(int i = 0; i < N; i++){
for(int j = 0; j < N-1; j++){
flag = false;
if(cMap[i][j]==0){
int k = j+1;
while(k<=N-1){
if(cMap[i][k] != 0){
flag = true;
break;
}
k++;
}
if(flag){
cMap[i][j] = cMap[i][k];
cMap[i][k] = 0;
}
}
}
}
}
void mergeLeft(){
for(int i = 0; i < N; i++){
for(int j = 0; j < N-1; j++){
if(cMap[i][j] == cMap[i][j+1]){
cMap[i][j] *= 2;
cMap[i][j+1] = 0;
}
}
}
}
void left(){
moveLeft();
mergeLeft();
moveLeft();
}
void moveDown(){
for(int i = N-1; i > 0; i--){
for(int j = 0; j < N; j++){
flag = false;
if(cMap[i][j]==0){
int k = i-1;
while(k>=0){
if(cMap[k][j] != 0){
flag = true;
break;
}
k--;
}
if(flag){
cMap[i][j] = cMap[k][j];
cMap[k][j] = 0;
}
}
}
}
}
void mergeDown(){
for(int i = N-1; i > 0; i--){
for(int j = 0; j < N; j++){
if(cMap[i-1][j] == cMap[i][j]){
cMap[i][j] *= 2;
cMap[i-1][j] = 0;
}
}
}
}
void down(){
moveDown();
mergeDown();
moveDown();
}
void moveUp(){
for(int i = 0; i < N-1; i++){
for(int j = 0; j < N; j++){
flag = false;
if(cMap[i][j]==0){
int k = i+1;
while(k<= N-1){
if(cMap[k][j] != 0){
flag = true;
break;
}
k++;
}
if(flag){
cMap[i][j] = cMap[k][j];
cMap[k][j] = 0;
}
}
}
}
}
void mergeUp(){
for(int i = 0; i < N-1; i++){
for(int j = 0; j < N; j++){
if(cMap[i][j] == cMap[i+1][j]){
cMap[i][j] *= 2;
cMap[i+1][j] = 0;
}
}
}
}
void up(){
moveUp();
mergeUp();
moveUp();
}
int findMax(){
int max = 0;
for(int i = 0; i < N; i++){
for(int j = 0; j < N; j++){
if(cMap[i][j] > max)
max = cMap[i][j];
}
}
return max;
}
void playGame(){
for(int i = 0; i < 5; i++){
int dir = sel[i];
if(dir==0) right();
else if(dir==1) left();
else if(dir==2) down();
else if(dir==3) up();
}
ans = max(ans, findMax());
}
void print(){
for(int i = 0; i < N; i++){
for(int j = 0; j < N; j++){
cout << cMap[i][j] << ' ';
}
cout << '\n';
}
}
void selectDir(int idx, int cnt){
if(cnt == 5){
copyMap();
playGame();
return;
}
for(int i = 0; i < 4; i++){
sel[cnt] = i;
selectDir(i, cnt+1);
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
int inp;
cin >> N;
for(int i = 0; i < N; i++){
for(int j = 0; j < N; j++){
cin >> Map[i][j];
}
}
selectDir(0, 0);
cout << ans;
}
댓글