#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <queue>
using namespace std;
 
int N;
int map[25][25];
int mapCopy[25][25];
int candidate[10];
int Max;
 
void reset()
{
    for(int i = 1; i <= N; i++)
    {
        for(int j = 1; j <= N; j++)
        {
            map[i][j] = mapCopy[i][j];
        }
    }
}
 
int find()
{
    int val = 0;
    
    for(int i = 1; i <= N; i++)
    {
        for(int j = 1; j <= N; j++)
        {
            if(val < map[i][j])
            {
                val = map[i][j];
            }
        }
    }
    
    return val;
}
 
void move()
{
    for(int k = 0; k < 5; k++)
    {        
        // 오른쪽 
        if(candidate[k] == 0)
        {
            for(int i = 1; i <= N; i++)
            {
                deque<int> q;        // 유효한 숫자만 저장하는 덱 -> 0은 저장X 
                bool merge = false// 이미 합쳐졌던 블록인지 확인 
                
                for(int j = N; j >= 1; j--)
                {
                    // 마지막 숫자와 현재 숫자가 같으면 합침 + 전에 합쳐진 블록이 아니면
                    if(q.size() >= 1 && q[q.size()-1== map[i][j] && merge == false)
                    {
                        q[q.size()-1+= map[i][j];
                        merge = true;
                    }
                    // 0인 경우는 저장X 
                    else if(map[i][j] != 0)
                    {
                        q.push_back(map[i][j]);        
                        merge = false;
                    }
                }        
                
                for(int j = N; j >= 1; j--)
                {
                    // 유효한 숫자가 있는 구간에서는 차례대로 넣어줌 
                    if(q.size() >= 1)
                    {
                        map[i][j] = q.front();
                        q.pop_front();
                    }
                    // 유효한 숫자가 아닌 구간에서는 0을 넣어줌 
                    else
                    {
                        map[i][j] = 0;
                    }
                }
            } 
        }
        // 왼쪽
        else if(candidate[k] == 1)
        {        
            for(int i = 1; i <= N; i++)
            {
                deque<int> q;        
                bool merge = false
            
                for(int j = 1; j <= N; j++)
                {
                    if(q.size() >= 1 && q[q.size()-1== map[i][j] && merge == false)
                    {
                        q[q.size()-1+= map[i][j];
                        merge = true;
                    }
                    else if(map[i][j] != 0)
                    {
                        q.push_back(map[i][j]);        
                        merge = false;
                    }
                }        
                
                for(int j = 1; j <= N; j++)
                {
                    if(q.size() >= 1)
                    {
                        map[i][j] = q.front();
                        q.pop_front();
                    }
                    else
                    {
                        map[i][j] = 0;
                    }
                }
            } 
        } 
        // 위쪽 
        else if(candidate[k] == 2)
        {                
            for(int j = 1; j <= N; j++)
            {
                deque<int> q;
                bool merge = false;
            
                for(int i = 1; i <= N; i++)
                {
                    if(q.size() >= 1 && q[q.size()-1== map[i][j] && merge == false)
                    {
                        q[q.size()-1+= map[i][j];
                        merge = true;
                    }
                    else if(map[i][j] != 0)
                    {
                        q.push_back(map[i][j]);        
                        merge = false;
                    }
                }        
                
                for(int i = 1; i <= N; i++)
                {
                    if(q.size() >= 1)
                    {
                        map[i][j] = q.front();
                        q.pop_front();
                    }
                    else
                    {
                        map[i][j] = 0;
                    }
                }
            } 
        }
        // 아래쪽 
        else if(candidate[k] == 3)
        {
            for(int j = 1; j <= N; j++)
            {
                deque<int> q;
                bool merge = false;
            
                for(int i = N; i >= 1; i--)
                {
                    if(q.size() >= 1 && q[q.size()-1== map[i][j] && merge == false)
                    {
                        q[q.size()-1+= map[i][j];
                        merge = true;
                    }
                    else if(map[i][j] != 0)
                    {
                        q.push_back(map[i][j]);        
                        merge = false;
                    }
                }        
                
                for(int i = N; i >= 1; i--)
                {
                    if(q.size() >= 1)
                    {
                        map[i][j] = q.front();
                        q.pop_front();
                    }
                    else
                    {
                        map[i][j] = 0;
                    }
                }
            } 
        }
    }
}
 
void permutation(int cnt)
{
    if(cnt == 5)
    {
        // 이동 
        move();
        
        // 최댓값 확인 
        Max = max(Max, find());
        
        // 리셋 
        reset();
        
        return;
    }
    
    for(int i = 0; i < 4; i++)
    {
        candidate[cnt] = i;
        permutation(cnt+1);
    }
}
 
 
int main(void)
{
//    freopen("B12100_input.txt", "r", stdin);
    
    cin >> N;
    
    for(int i = 1; i <= N; i++)
    {
        for(int j = 1; j <= N; j++)
        {
            cin >> map[i][j];
            mapCopy[i][j] = map[i][j];
        }
    }
    
    permutation(0);
    
    cout << Max << endl;
 
    return 0;
}
cs

+ Recent posts