2048 κ²μμ 4Γ4 ν¬κΈ°μ 보λμμ νΌμ μ¦κΈ°λ μ¬λ―Έμλ κ²μμ΄λ€. μ΄ λ§ν¬λ₯Ό λλ₯΄λ©΄ κ²μμ ν΄λ³Ό μ μλ€.
μ΄ κ²μμμ ν λ²μ μ΄λμ 보λ μμ μλ μ 체 λΈλ‘μ μνμ’μ° λ€ λ°©ν₯ μ€ νλλ‘ μ΄λμν€λ κ²μ΄λ€. μ΄λ, κ°μ κ°μ κ°λ λ λΈλ‘μ΄ μΆ©λνλ©΄ λ λΈλ‘μ νλλ‘ ν©μ³μ§κ² λλ€. ν λ²μ μ΄λμμ μ΄λ―Έ ν©μ³μ§ λΈλ‘μ λ λ€λ₯Έ λΈλ‘κ³Ό λ€μ ν©μ³μ§ μ μλ€. (μ€μ κ²μμμλ μ΄λμ ν λ² ν λλ§λ€ λΈλ‘μ΄ μΆκ°λμ§λ§, μ΄ λ¬Έμ μμ λΈλ‘μ΄ μΆκ°λλ κ²½μ°λ μλ€) λκ°μ μκ° μΈ κ°κ° μλ κ²½μ°μλ μ΄λνλ €κ³ νλ μͺ½μ μΉΈμ΄ λ¨Όμ ν©μ³μ§λ€. μλ₯Ό λ€μ΄, μλ‘ μ΄λμν€λ κ²½μ°μλ μμͺ½μ μλ λΈλ‘μ΄ λ¨Όμ ν©μ³μ§κ² λλ€. μ΄ λ¬Έμ μμ λ€λ£¨λ 2048 κ²μμ 보λμ ν¬κΈ°κ° NΓN μ΄λ€. 보λμ ν¬κΈ°μ 보λνμ λΈλ‘ μνκ° μ£Όμ΄μ‘μ λ, μ΅λ 5λ² μ΄λν΄μ λ§λ€ μ μλ κ°μ₯ ν° λΈλ‘μ κ°μ ꡬνλ νλ‘κ·Έλ¨μ μμ±νμμ€.
(λ€ νΈλλ° 2μκ° λκ² κ±Έλ¦°λ― νλ©΄μ λλ¬Όμ΄ λ¬λ»νλ€... μλ νλ λ°©μμ΄ μ λΌμ κ²°κ΅ μΉ λ€ μκ³ λ ΈνΈμ μ μ΄κ°λ©° μ°¨κ·Όμ°¨κ·Ό λ€μ μ€κ³...)
μ°μ λͺ λ² μ΄λ μ΄λ°κ±° μμ΄ ν λ² μ΄λν λ μ λλ‘ λλμ§λΆν° νμΈν΄μΌ νλ€. λ΄κ° μκ°ν λ°©λ²μ
1. λ°©ν₯λλ‘ μΉ λ°μ΄μ ν κ΅°λ°λ‘ λͺ¨μλ€. (μμλ₯Ό μ§ν€λ©°)
2. λ°μ΄μ λͺ¨μ μ«μλ€μ νμΈν΄ ν©μ³μ§λ 쑰건μ λ§λ μ«μλ€μ μ²λ¦¬νλ€.
3. μμμ μ²λ¦¬ν μ«μλ€μ λ€μ 보λμ μ±μ΄λ€.
μ΄λ€. ν΄λΉ λ°©λ²λλ‘ μ΄λ»κ² ꡬνν μ§ λ°μμ λ€μ μ€λͺ
ν΄λ³Έλ€.
save
μ λ£λλ€. λ€λ§, 0μ΄ μ±μμ Έ μμ κ²½μ°μλ ν¬ν¨νμ§ μλλ€.save
μμ μ«μλ₯Ό νλμ© κΊΌλΈλ€. μ΄ μ«μλ₯Ό κΊΌλΌ λ, pre_num
κ³Ό λΉκ΅νλ€.(λ€λ§ pre_num
μ μ΄μ μ ν λ² ν©μ³μ§ μ«μκ° λ€μ΄κ°μ§ μκ² νλ€.) μ΄λ λ°λ‘ μμ μλ μ«μλ‘, λ§μ½ (λ°©κΈ κΊΌλΈ)λμ κ°μ΄ λκ°μ§ μλ€λ©΄, 무μνκ³ κ·Έλ₯ μλ‘μ΄ list
μ κΊΌλΈ κ°μ λ£λλ€. κ·Έλ¦¬κ³ pre_num
μ λ°©κΈ λ£μ κ°μ΄ λλ€. νμ§λ§ λ§μ½ λκ°λ€λ©΄ λ μ«μλ ν©μ³μ Έ μλ‘μ΄ list
μ λ€μ΄κ°κ² λλ€. κ·Έλ¦¬κ³ pre_num
μ -1λ‘ λ§λ€μ΄ μ£Όμ΄μΌ νλ€. κ·Έλ μ§ μμΌλ©΄ μ΄ν λκ°μ μ«μμ ν©μ³μ§κ² λλ κΌ΄μ΄ λ μ μκΈ° λλ¬Έμ΄λ€. μ΄λ₯Ό save
μ λͺ¨λ κ°μ νμΈν λκΉμ§ λ°λ³΅νλ€.#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int N, maxx = 0;
int board[20][20];
vector<int> save[20];
vector<int> list[20];
int dx[2] = { 0, 1 }; // μ, μΌ, μλ, μ€
int dy[2] = { 1, 0 };
void initialVector() {
for (int i = 0; i < N; i++) {
save[i].clear();
list[i].clear();
}
}
void reposition(int direction) { // 3.
int x, y;
if (direction == 0) {
for (int i = 0; i < N; i++) { // dir 0
for (int j = 0; j < N; j++) {
if (list[j].size() > i) {
board[i][j] = list[j][i];
if (maxx < board[i][j]) maxx = board[i][j];
}
else {
board[i][j] = 0;
}
}
}
}
else if (direction == 1) {
for (int i = 0; i < N; i++) { // dir 1
for (int j = 0; j < N; j++) {
if (list[i].size() > j) {
board[i][j] = list[i][j];
if (maxx < board[i][j]) maxx = board[i][j];
}
else {
board[i][j] = 0;
}
}
}
}
else if (direction == 2) {
for (int i = N-1; i >= 0; i--) { // dir 2
for (int j = N-1; j >= 0; j--) {
if (list[j].size() > (N-i-1)) {
board[i][j] = list[j][N-i-1];
if (maxx < board[i][j]) maxx = board[i][j];
}
else {
board[i][j] = 0;
}
}
}
}
else if (direction == 3) {
for (int i = N-1; i >= 0; i--) { // dir 3
for (int j = N-1; j >= 0; j--) {
if (list[i].size() > (N-j-1)) {
board[i][j] = list[i][N-j-1];
if (maxx < board[i][j]) maxx = board[i][j];
}
else {
board[i][j] = 0;
}
}
}
}
}
void merge() { // 2.
for (int i = 0; i < N; i++) {
int pre_num = -1;
int top_idx = 0;
while (top_idx < save[i].size()) {
if (save[i][top_idx] == pre_num) {
pre_num = -1;
list[i].pop_back();
list[i].push_back(save[i][top_idx++]*2);
}
else {
pre_num = save[i][top_idx++];
list[i].push_back(pre_num);
}
}
}
}
void push(int direction) { // 1.
int x, y;
if (direction/2 == 0) {
for (int x = 0; x < N; x++) {
for (int y = 0; y < N; y++) {
if (board[x][y] != 0) save[x*dx[direction%2] + y*dy[direction%2]].push_back(board[x][y]);
}
}
}
else {
for (int x = N-1; x >= 0; x--) {
for (int y = N-1; y >= 0; y--) {
if (board[x][y] != 0) save[x*dx[direction%2] + y*dy[direction%2]].push_back(board[x][y]);
}
}
}
}
void find_max() {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (maxx < board[i][j]) maxx = board[i][j];
}
}
}
void bt(int step) {
if (step == 5) {
return ;
}
int temp_board[20][20];
copy(&board[0][0], &board[0][0]+400, &temp_board[0][0]);
for (int i = 0; i < 4; i++) {
initialVector();
copy(&temp_board[0][0], &temp_board[0][0]+400, &board[0][0]);
push(i);
merge();
reposition(i);
bt(step+1);
}
}
int main() {
cin >> N;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cin >> board[i][j];
}
}
bt(0);
cout << maxx;
return 0;
}