본문 바로가기
PS(구 C++)

백준 12100 2048(Easy) C++

by 같이긍뱅와 2022. 2. 15.
#include<bits/stdc++.h>
#define MAX 21
using namespace std;
int N, ans;
int Map[MAX][MAX];
int cMap[MAX][MAX];
int sel[5];
bool flag;

void copyMap(){
    for(int i = 0; i < N; i++){
        for(int j = 0; j < N; j++){
            cMap[i][j] = Map[i][j];
        }
    }
}

void moveRight(){
    for(int i = 0; i < N; i++){
        for(int j = N-1; j > 0; j--){
            flag = false;
            if(cMap[i][j]==0){
                int k = j-1;
                while(k>=0){
                    if(cMap[i][k] != 0){
                        flag = true;
                        break;
                    }
                    k--;
                }
                if(flag){
                    cMap[i][j] = cMap[i][k];
                    cMap[i][k] = 0;
                }
            }
        }
    }
}
void mergeRight(){
    for(int i = 0; i < N; i++){
        for(int j = N-1; j > 0; j--){
            if(cMap[i][j]==cMap[i][j-1]){
                cMap[i][j] *= 2;
                cMap[i][j-1] = 0;
            }
        }
    }
}
void right(){
    moveRight();
    mergeRight();
    moveRight();
}

void moveLeft(){
    for(int i = 0; i < N; i++){
        for(int j = 0; j < N-1; j++){
            flag = false;
            if(cMap[i][j]==0){
                int k = j+1;
                while(k<=N-1){
                    if(cMap[i][k] != 0){
                        flag = true;
                        break;
                    }
                    k++;
                }
                if(flag){
                    cMap[i][j] = cMap[i][k];
                    cMap[i][k] = 0;
                }
            }
        }
    }
}
void mergeLeft(){
    for(int i = 0; i < N; i++){
        for(int j = 0; j < N-1; j++){
            if(cMap[i][j] == cMap[i][j+1]){
                cMap[i][j] *= 2;
                cMap[i][j+1] = 0;
            }
        }
    }
}
void left(){
    moveLeft();
    mergeLeft();
    moveLeft();
}

void moveDown(){
    for(int i = N-1; i > 0; i--){
        for(int j = 0; j < N; j++){
            flag = false;
            if(cMap[i][j]==0){
                int k = i-1;
                while(k>=0){
                    if(cMap[k][j] != 0){
                        flag = true;
                        break;
                    }
                    k--;
                }
                if(flag){
                    cMap[i][j] = cMap[k][j];
                    cMap[k][j] = 0;
                }
            }
        }
    }
}

void mergeDown(){
    for(int i = N-1; i > 0; i--){
        for(int j = 0; j < N; j++){
            if(cMap[i-1][j] == cMap[i][j]){
                cMap[i][j] *= 2;
                cMap[i-1][j] = 0;
            }
        }
    }
}

void down(){
    moveDown();
    mergeDown();
    moveDown();
}

void moveUp(){
    for(int i = 0; i < N-1; i++){
        for(int j = 0; j < N; j++){
            flag = false;
            if(cMap[i][j]==0){
                int k = i+1;
                while(k<= N-1){
                    if(cMap[k][j] != 0){
                        flag = true;
                        break;
                    }
                    k++;
                }
                if(flag){
                    cMap[i][j] = cMap[k][j];
                    cMap[k][j] = 0;
                }
            }
        }
    }
}

void mergeUp(){
    for(int i = 0; i < N-1; i++){
        for(int j = 0; j < N; j++){
            if(cMap[i][j] == cMap[i+1][j]){
                cMap[i][j] *= 2;
                cMap[i+1][j] = 0;
            }
        }
    }
}

void up(){
    moveUp();
    mergeUp();
    moveUp();
}

int findMax(){
    int max = 0;
    for(int i = 0; i < N; i++){
        for(int j = 0; j < N; j++){
            if(cMap[i][j] > max)
                max = cMap[i][j];
        }
    }
    return max;
}

void playGame(){
    for(int i = 0; i < 5; i++){
        int dir = sel[i];
        if(dir==0) right();
        else if(dir==1) left();
        else if(dir==2) down();
        else if(dir==3) up();
    }
    ans = max(ans, findMax());
}
void print(){
    for(int i = 0; i < N; i++){
        for(int j = 0; j < N; j++){
            cout << cMap[i][j] << ' ';
        }
        cout << '\n';
    }
}

void selectDir(int idx, int cnt){
    if(cnt == 5){
        copyMap();
        playGame();
        return;
    }
    for(int i = 0; i < 4; i++){
        sel[cnt] = i;
        selectDir(i, cnt+1);
    }
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    int inp;
    cin >> N;
    for(int i = 0; i < N; i++){
        for(int j = 0; j < N; j++){
            cin >> Map[i][j];
        }
    }
    selectDir(0, 0);
    cout << ans;
}

'PS(구 C++)' 카테고리의 다른 글

백준 2448 별 찍기 - 11 C++  (0) 2022.02.16
백준 1074번 Z C++  (0) 2022.02.16
백준 1107 리모컨 C++  (0) 2022.02.14
백준 1339 단어 수학 C++  (0) 2022.02.14
백준 14890 경사로 C++  (0) 2022.02.09

댓글