BOJ 12100번: 2048 (Easy)

2021-04-25

BOJ

문제

입력

출력

풀이

코드

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const char nl = '\n';

int N;
int board[20][20];

void copyBoard(int a[][20], int b[][20]) {
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            a[i][j] = b[i][j];
        }
    }
}

void checkSame(int dir) {
    if (dir == 0) {
        // 왼쪽
        for (int i = 0; i < N; i++) {
            int l = 0, r = 1;
            while (r < N) {
                if (board[i][r]) {
                    if (board[i][l] == board[i][r]) {
                        board[i][l] *= 2;
                        board[i][r] = 0;
                        l = r + 1;
                        r = r + 2;
                    } else {
                        l = r;
                        r = r + 1;
                    }
                } else r++;
            }
        }
    } else if (dir == 1) {
        // 오른쪽
        for (int i = 0; i < N; i++) {
            int l = N - 1, r = N - 2;
            while (r >= 0) {
                if (board[i][r]) {
                    if (board[i][l] == board[i][r]) {
                        board[i][l] *= 2;
                        board[i][r] = 0;
                        l = r - 1;
                        r = r - 2;
                    } else {
                        l = r;
                        r = r - 1;
                    }
                } else r--;
            }
        }
    } else if (dir == 2) {
        // 위
        for (int i = 0; i < N; i++) {
            int l = 0, r = 1;
            while (r < N) {
                if (board[r][i]) {
                    if (board[l][i] == board[r][i]) {
                        board[l][i] *= 2;
                        board[r][i] = 0;
                        l = r + 1;
                        r = r + 2;
                    } else {
                        l = r;
                        r = r + 1;
                    }
                } else r++;
            }
        }
    } else if (dir == 3) {
        // 아래
        for (int i = 0; i < N; i++) {
            int l = N - 1, r = N - 2;
            while (r >= 0) {
                if (board[r][i]) {
                    if (board[l][i] == board[r][i]) {
                        board[l][i] *= 2;
                        board[r][i] = 0;
                        l = r - 1;
                        r = r - 2;
                    } else {
                        l = r;
                        r = r - 1;
                    }
                } else r--;
            }
        }
    }
}

void moveBoard(int dir) {
    if (dir == 0) {
        // 왼쪽
        for (int i = 0; i < N; i++) {
            vector<int> v;
            for (int j = 0; j < N; j++) {
                if (board[i][j]) {
                    v.push_back(board[i][j]);
                    board[i][j] = 0;
                }
            }
            int x = 0;
            for (int& k : v) board[i][x++] = k;
        }
    } else if (dir == 1) {
        // 오른쪽
        for (int i = 0; i < N; i++) {
            vector<int> v;
            for (int j = N - 1; j >= 0; j--) {
                if (board[i][j]) {
                    v.push_back(board[i][j]);
                    board[i][j] = 0;
                }
            }
            int x = N - 1;
            for (int& k : v) board[i][x--] = k;
        }
    } else if (dir == 2) {
        // 위
        for (int i = 0; i < N; i++) {
            vector<int> v;
            for (int j = 0; j < N; j++) {
                if (board[j][i]) {
                    v.push_back(board[j][i]);
                    board[j][i] = 0;
                }
            }
            int y = 0;
            for (int& k : v) board[y++][i] = k;
        }
    } else if (dir == 3) {
        // 아래
        for (int i = 0; i < N; i++) {
            vector<int> v;
            for (int j = N - 1; j >= 0; j--) {
                if (board[j][i]) {
                    v.push_back(board[j][i]);
                    board[j][i] = 0;
                }
            }
            int y = N - 1;
            for (int& k : v) board[y--][i] = k;
        }
    }
}

int checkMax() {
    int mx = 0;
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            mx = max(mx, board[i][j]);
        }
    }
    return mx;
}

int f(int n, int dir) {
    if (n == 5) return checkMax();
    checkSame(dir);
    moveBoard(dir);
    int ret = 0;
    int tmpBoard[20][20];
    copyBoard(tmpBoard, board);
    for (int d = 0; d < 4; d++) {
        ret = max(ret, f(n + 1, d));
        copyBoard(board, tmpBoard);
    }
    return ret;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cin >> N;
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            cin >> board[i][j];
        }
    }
    cout << f(-1, -1) << nl;
    return 0;
}

https://www.acmicpc.net/problem/12100