큐, 백트래킹 활용

#include<iostream>
#include<vector>
#include<queue>
using namespace std;

const int MAX_N = 20;
int N;
vector<vector<int>> InputBoard(MAX_N, vector<int>(MAX_N, 0));
int Best = -1;

void MoveBoard(vector<vector<int>>& Board, int Direction) 
{
    queue<int> Q;

    // Left
    if (Direction == 0) 
    {
        for (int i = 0; i < N; i++) 
        {
            for (int j = 0; j < N; j++) 
            {
                if (Board[i][j]) 
                {
                    Q.push(Board[i][j]);
                }
                Board[i][j] = 0;
            }

            int Index = 0;

            while (!Q.empty()) 
            {
                int num = Q.front();
                Q.pop();
                if (Board[i][Index] == 0) 
                {
                    Board[i][Index] = num;
                }
                else if (Board[i][Index] == num) 
                {
                    Board[i][Index] *= 2;
                    Index++;
                }
                else 
                {
                    Index++;
                    Board[i][Index] = num;
                }
            }
        }
    }
    // Up
    else if (Direction == 1) 
    {
        for (int i = 0; i < N; i++) 
        {
            for (int j = 0; j < N; j++) 
            {
                if (Board[j][i]) 
                {
                    Q.push(Board[j][i]);
                }
                Board[j][i] = 0;
            }

            int Index = 0;

            while (!Q.empty()) 
            {
                int num = Q.front();
                Q.pop();
                if (Board[Index][i] == 0) 
                {
                    Board[Index][i] = num;
                }
                else if (Board[Index][i] == num) 
                {
                    Board[Index][i] *= 2;
                    Index++;
                }
                else 
                {
                    Index++;
                    Board[Index][i] = num;
                }
            }
        }
    }
    // Right
    else if (Direction == 2) 
    {
        for (int i = 0; i < N; i++) 
        {
            for (int j = N - 1; j >= 0; j--) 
            {
                if (Board[i][j]) 
                {
                    Q.push(Board[i][j]);
                }
                Board[i][j] = 0;
            }

            int Index = N - 1;

            while (!Q.empty()) 
            {
                int num = Q.front();
                Q.pop();
                if (Board[i][Index] == 0) 
                {
                    Board[i][Index] = num;
                }
                else if (Board[i][Index] == num) 
                {
                    Board[i][Index] *= 2;
                    Index--;
                }
                else
                {
                    Index--;
                    Board[i][Index] = num;
                }
            }
        }
    }
    // Down
    else if (Direction == 3) 
    {
        for (int i = 0; i < N; i++) 
        {
            for (int j = N - 1; j >= 0; j--) 
            {
                if (Board[j][i])
                {
                    Q.push(Board[j][i]);
                }
                Board[j][i] = 0;
            }

            int Index = N - 1;

            while (!Q.empty()) 
            {
                int num = Q.front();
                Q.pop();

                if (Board[Index][i] == 0)
                {
                    Board[Index][i] = num;
                }
                else if (Board[Index][i] == num)
                {
                    Board[Index][i] *= 2;
                    Index--;
                }
                else 
                {
                    Index--;
                    Board[Index][i] = num;
                }
            }
        }
    }
}

void BackTracking(vector<vector<int>>& Board, int cnt)
{
    if (cnt == 5)
    {
        for (int i = 0; i < N; i++) 
        {
            for (int j = 0; j < N; j++)
            {
                Best = max(Best, Board[i][j]);
            }
        }
        return;
    }

    vector<vector<int>> Temp = Board;

    for (int i = 0; i < 4; i++) 
    {
        MoveBoard(Board, i);
        BackTracking(Board, cnt + 1);
        Board = Temp;
    }
}

int main() {
    ios_base::sync_with_stdio(false); cin.tie(0);

    cin >> N;

    for (int i = 0; i < N; i++) 
    {
        for (int j = 0; j < N; j++) 
        {
            cin >> InputBoard[i][j];
        }
    }

    BackTracking(InputBoard, 0);

    cout << Best;

    return 0;
}