구현
문제에서 구해야 할 내용은 다음과 같다.
각각의 방향에 대한 이동방법은 임시 배열을 만들어서, 이전의 값과 동일한 값이 나오는 경우, 이전의 값을 2배로 만들도록 임시 배열을 채운 후, 임시 배열 값을 원래의 배열에 카피하여 반영했다.
5번을 모두 탐색했다면, 현재의 배열 내에서 가장 큰 값을 찾아, 현재 최댓값과 비교한다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int N, ans;
vector<vector<int>> v;
void input() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> N;
v.resize(N, vector<int>(N, 0));
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cin >> v[i][j];
}
}
}
int getMax(vector<vector<int>> &curr) {
int ret = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
ret = max(ret, curr[i][j]);
}
}
return ret;
}
void go(vector<vector<int>> &curr) {
vector<vector<int>> tmp(N, vector<int>(N, 0));
for (int i = 0; i < N; i++) {
int cIdx = 0;
bool check = false;
for (int j = 0; j < N; j++) {
if (!curr[i][j]) continue;
if (check && curr[i][j] == tmp[i][cIdx-1]) {
tmp[i][cIdx-1] *= 2;
check = false;
} else {
tmp[i][cIdx++] = curr[i][j];
check = true;
}
}
while(cIdx<N) tmp[i][cIdx++] = 0;
}
copy(tmp.begin(), tmp.end(), curr.begin());
}
void rotate(vector<vector<int>> &curr) {
vector<vector<int>> tmp(N, vector<int>(N, 0));
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
tmp[i][j] = curr[N - j - 1][i];
}
}
copy(tmp.begin(), tmp.end(), curr.begin());
}
void solve(vector<vector<int>> &curr, int cnt) {
if (cnt >= 5) {
ans = max(ans, getMax(curr));
return;
}
for (int i = 0; i < 4; i++) {
vector<vector<int>> tmp(curr);
go(tmp);
solve(tmp, cnt + 1);
rotate(curr);
}
}
void output() {
cout << ans;
}
int main() {
input();
solve(v, 0);
output();
}