큐, 백트래킹 활용
#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;
}