반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

코딩하기 좋은날

백준 12100 2048(Easy) 본문

백준(Baekjoon) 문제

백준 12100 2048(Easy)

huiung 2020. 4. 18. 11:08
반응형

이 문제는 각판을 상하좌우로 움직여서 같은 숫자들끼리 합치는 게임입니다. 이때 한번 움직일때는 이미 합쳐진 숫자끼린 합쳐지지 않는 다는점을 주의 하셔야합니다. 2 2 2 2 가있다면 한번 왼쪽으로 움직이면 8 0 0 0 이 아니라 4 4 0 0 이 됩니다. 

 

먼저 5번까지 움직일수 있으므로 5번 움직이는 재귀함수를 하나 작성합니다. 이 함수내부에서 현재의 배열을 각각

상하좌우로 움직여보고 그 결과값을 호출하는 함수에 전달하면 됩니다.

 

상하좌우로 움직이는 코드는  저는 각각 함수로 만들었는데

 

만약 위로 움직인다면 각 열을 기준으로 위에서 부터 아래로 훑으면서 같은 숫자가 있다면 더해서 맨 윗칸에 채우고 다른 숫자라면 이전 숫자를 들어가야 하는 윗칸에 채우는 식으로 채워주었습니다. 

 

아래로 움직인다면 각열을 기준으로 아래에서 부터 위로 훑으면 되고, 왼쪽으로 움직인다면 각 행을 기준으로 왼->오

오른쪽은 각 행을 기준으로 오->왼 으로 훑는 다고 생각하시면 됩니다. 이후 5번을 각각 움직여 주시면 됩니다.

 

#include <bits/stdc++.h>

using namespace std;

int board[21][21];
int N;
int ans;

void up(int cur[21][21]) {

    for(int i = 0; i < N; i++) {
        int idx = 0;
        int prev = -1;
        for(int j = 0; j < N; j++) {
            if(cur[j][i] == 0) continue;

            if(prev == cur[j][i]) {
                cur[idx++][i] = prev*2;
                prev = -1;
                continue;
            }
            else if(prev != -1){
                cur[idx++][i] = prev;
            }
            prev = cur[j][i];
        }

        if(prev != -1) cur[idx++][i] = prev;

        for(int j = idx; j < N; j++)
            cur[j][i] = 0;
    }
    return;
}

void down(int cur[21][21]) {

     for(int i = 0; i < N; i++) {
        int idx = N-1;
        int prev = -1;
        for(int j = N-1; j >= 0; j--) {
            if(cur[j][i] == 0) continue;

            if(prev == cur[j][i]) {
                cur[idx--][i] = prev*2;
                prev = -1;
                continue;
            }
            else if(prev != -1){
                cur[idx--][i] = prev;
            }
            prev = cur[j][i];
        }

        if(prev != -1) cur[idx--][i] = prev;

        for(int j = idx; j >= 0; j--)
            cur[j][i] = 0;
    }
    return;
}

void left(int cur[21][21]) {

    for(int i = 0; i < N; i++) {
        int idx = 0;
        int prev = -1;
        for(int j = 0; j < N; j++) {
            if(cur[i][j] == 0) continue;

            if(prev == cur[i][j]) {
                cur[i][idx++] = prev*2;
                prev = -1;
                continue;
            }
            else if(prev != -1) {
                cur[i][idx++] = prev;
            }
            prev = cur[i][j];

        }
        if(prev != -1) cur[i][idx++] = prev;

        for(int j = idx; j < N; j++)
            cur[i][j] = 0;
    }
    return;
}

void right(int cur[21][21]) {

     for(int i = 0; i < N; i++) {
        int idx = N-1;
        int prev = -1;
        for(int j = N-1; j >= 0; j--) {
            if(cur[i][j] == 0) continue;

            if(prev == cur[i][j]) {
                cur[i][idx--] = prev*2;
                prev = -1;
                continue;
            }
            else if(prev != -1) {
                cur[i][idx--] = prev;
            }
            prev = cur[i][j];

        }
        if(prev != -1) cur[i][idx--] = prev;

        for(int j = idx; j >= 0; j--)
            cur[i][j] = 0;
    }
    return;
}

void sol(int cnt, int cur[21][21]) {

    if(cnt==0) {
        for(int i = 0; i < N; i++)
            for(int j = 0; j < N; j++)
                ans = max(ans, cur[i][j]);
        return;
    }

    int cp[4][21][21];

    for(int i = 0; i < 4; i++)
        for(int j = 0; j < N; j++)
            for(int k = 0; k < N; k++)
                cp[i][j][k] = cur[j][k];


    up(cp[0]);
    down(cp[1]);
    left(cp[2]);
    right(cp[3]);

    sol(cnt-1, cp[0]);
    sol(cnt-1, cp[1]);
    sol(cnt-1, cp[2]);
    sol(cnt-1, cp[3]);

    return;
}

int main(void) {
    ios_base::sync_with_stdio(false); cin.tie(NULL);
    cin >> N;
    for(int i = 0; i < N; i++)
        for(int j = 0; j < N; j++)
            cin >> board[i][j];

    sol(5, board);
    cout<<ans<<'\n';

    return 0;
}
반응형

'백준(Baekjoon) 문제' 카테고리의 다른 글

백준 14890 경사로  (0) 2020.04.19
백준 14500 테트로미노  (0) 2020.04.19
백준 18809 Gaaaaaaaaaarden  (2) 2020.03.23
백준 18808 스티커 붙이기  (0) 2020.03.23
백준 14444 가장 긴 팰린드롬 부분 문자열  (0) 2020.03.22