✏️ Algorithm/알고리즘 풀이

백준 - 12100번 2048 (Easy) / C++

미미누 2022. 1. 23. 11:17

[문제]

 

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

 

12100번: 2048 (Easy)

첫째 줄에 보드의 크기 N (1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 게임판의 초기 상태가 주어진다. 0은 빈 칸을 나타내며, 이외의 값은 모두 블록을 나타낸다. 블록에 쓰여 있는 수는 2

www.acmicpc.net

 

[풀이]

시뮬레이션 + 90,180,270,360도 회전 알고리즘

 

[코드]

#include <bits/stdc++.h>
using namespace std;

int board1[21][21];
int board2[21][21];
int n;

void rotate(){
    int tmp[21][21];
    for(int i=0; i<n; i++)
        for(int j=0; j<n; j++)
            tmp[i][j] = board2[i][j];
            
    for(int i=0; i<n; i++)
        for(int j=0; j<n; j++)
            board2[i][j] = tmp[n-1-j][i];
}

void tilt(int dir){
    while(dir--) rotate();
    for(int i=0; i<n; i++){
        int tilted[21] = {};
        int idx = 0;
        for(int j=0; j<n; j++){
            if(board2[i][j] == 0) continue;
            if(tilted[idx] == 0)
                tilted[idx] = board2[i][j];
            else if(tilted[idx] == board2[i][j])
                tilted[idx++] *=2;
            else
                tilted[++idx] = board2[i][j];
        }
        for(int j=0; j<n; j++) board2[i][j] = tilted[j];
    }
}

int main(void){
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    cin >> n;
    for(int i=0; i<n; i++)
        for(int j=0; j<n; j++)
            cin >> board1[i][j];
    
    int mx = 0;
    for(int tmp =0; tmp<1024; tmp++){
        for(int i=0; i<n; i++)
            for(int j=0; j<n; j++)
                board2[i][j] = board1[i][j];
        int brute =tmp;
        for(int i=0; i<5; i++){
            int dir = brute % 4;
            brute /=4;
            tilt(dir);

        }
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<n; j++)
                mx = max(mx, board2[i][j]);
        }
        
    }
    cout << mx;
    
}