// 요구사항
// 1. 4방향 중력
// => temp_map 만들어야 하나?
// 2. 최대값 찾기
// 3. 5번 움직일 동안 방향 선택하기
// =>
#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>
#define MAP_SIZE 25
using namespace std;
int n, answer;
int MAP[MAP_SIZE][MAP_SIZE];
int ORIG_MAP[MAP_SIZE][MAP_SIZE];
vector<int> picked;
void CLEAR()
{
n = 0;
answer = 0;
memset(MAP, 0, sizeof(MAP));
memset(ORIG_MAP, 0, sizeof(ORIG_MAP));
picked.clear();
}
// 상, 하, 좌, 우
int dr[] = {-1, 1,0 ,0};
int dc[] = {0, 0,-1, 1};
void INIT()
{
cin >> n;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cin >> ORIG_MAP[i][j];
}
}
}
int getMax()
{
int maxAns = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
if (maxAns < MAP[i][j])
maxAns = MAP[i][j];
return maxAns;
}
void mix(int dir)
{
// 1. 같은 숫자 확인
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n-1; j++)
{
// 상
if (dir == 0)
{
if (MAP[j][i] == MAP[j + 1][i])
{
MAP[j][i] *= 2;
MAP[j + 1][i] = 0;
}
}
// 하
else if (dir == 1)
{
if (MAP[n - j - 1][i] == MAP[n - j - 2][i])
{
MAP[n - j - 1][i] *= 2;
MAP[n - j - 2][i] = 0;
}
}
// 좌
else if (dir == 2)
{
if (MAP[i][j] == MAP[i][j+1])
{
MAP[i][j] *= 2;
MAP[i][j+1] = 0;
}
}
// 우
else if (dir == 3)
{
if (MAP[i][n - j - 1] == MAP[i][n - j - 2])
{
MAP[i][n - j - 1] *= 2;
MAP[i][n - j - 2] = 0;
}
}
}
}
}
// 이동
void move(int dir)
{
for (int i = 0; i < n; i++)
{
int tmp[MAP_SIZE] = { 0 };
int idx = 0;
for (int j = 0; j < n; j++)
{
if (dir == 0)
{
if (MAP[j][i])
tmp[idx++] = MAP[j][i];
}
else if (dir == 1)
{
if (MAP[n - j - 1][i])
tmp[idx++] = MAP[n - j - 1][i];
}
else if (dir == 2)
{
if (MAP[i][j])
tmp[idx++] = MAP[i][j];
}
else if (dir == 3)
{
if (MAP[i][n - j - 1])
tmp[idx++] = MAP[i][n - j - 1];
}
}
for (int j = 0; j < n; j++)
{
if (dir == 0)
MAP[j][i] = tmp[j];
else if (dir == 1)
MAP[n - j - 1][i] = tmp[j];
else if (dir == 2)
MAP[i][j] = tmp[j];
else if (dir == 3)
MAP[i][n - j - 1] = tmp[j];
}
}
}
void printMap()
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cout << MAP[i][j] << " ";
}
cout << endl;
}
}
void copyOrigin()
{
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
MAP[i][j] = ORIG_MAP[i][j];
}
void dfs(int count)
{
if (count >= 5) {
copyOrigin();
for (int i = 0; i < picked.size(); i++)
{
mix(picked[i]);
move(picked[i]);
}
answer = max(answer, getMax());
return;
}
for (int i = 0; i < 4; i++)
{
picked.push_back(i);
dfs(count + 1);
picked.pop_back();
}
}
void SOLVE()
{
dfs(0);
cout << answer << "\n";
}
int main()
{
CLEAR();
INIT();
SOLVE();
return 0;
}
📌 memo 😊
코드 간결 vs 논리 간결
=> 논리가 간결해야 시간을 단축함
=> 코드의 효율성은 나중에 생각하자!!!
변수 이름 만들기 힘들어...
=> 무조건 Camel Style로 하자!!