반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
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
관리 메뉴

코딩하기 좋은날

백준 14500 테트로미노 본문

백준(Baekjoon) 문제

백준 14500 테트로미노

huiung 2020. 4. 19. 14:18
반응형

이 문제는 해당판에 주어진 5개의 테트로미노를 회전,대칭을 포함해서 놓았을때 가장 큰 값을 구하는 문제입니다.

원하는 테트로미노 모양마다 각칸에 넣어보면 되는 브루트 포스 문제입니다. 그렇다면 존재하는 모든 테트로미노의 모양을 구하는게 핵심인데 ㅗ ㅓ ㅏ ㅜ 이모양 말고는 dfs로 만들 수 있습니다. 그런데 사실 모든 경우를 따져봐도 19가지? 정도가 나와서 저는 그냥 모든 모양을 다 넣었습니다. 문제의 의도는 dfs를 이용하는 것이겠지만 그냥 뭐 이렇게 해도 풀리긴 합니다~. 물론 모양이 더많아지면 이렇게 하면 너무 힘들겠죠,,

 

다음은 코드입니다.

 

#include <bits/stdc++.h>

using namespace std;

int board[510][510];

int one[2][4][4] = {
    {
        1,1,1,1,
        0,0,0,0,
        0,0,0,0,
        0,0,0,0
    },
    {
        1,0,0,0,
        1,0,0,0,
        1,0,0,0,
        1,0,0,0
    }
};

int two[2][2] = {
    1,1,
    1,1
};

int three[8][3][3] {
    {
        1,0,0,
        1,0,0,
        1,1,0
    },
    {
        1,1,1,
        1,0,0,
        0,0,0
    },
    {
        1,1,1,
        0,0,1,
        0,0,0
    },
    {
        0,1,0,
        0,1,0,
        1,1,0
    },
    {
        1,1,0,
        0,1,0,
        0,1,0
    },
    {
        1,1,0,
        1,0,0,
        1,0,0
    },
    {
        1,0,0,
        1,1,1,
        0,0,0
    },
    {
        0,0,1,
        1,1,1,
        0,0,0
    }
};

int four[4][3][3] {
    {
        1,0,0,
        1,1,0,
        0,1,0
    },
    {
        0,1,0,
        1,1,0,
        1,0,0
    },
    {
        0,1,1,
        1,1,0,
        0,0,0
    },
    {
        1,1,0,
        0,1,1,
        0,0,0
    }
};

int five[4][3][3] {
    {
        1,1,1,
        0,1,0,
        0,0,0
    },
    {
        1,0,0,
        1,1,0,
        1,0,0
    },
    {
        0,1,0,
        1,1,1,
        0,0,0
    },
    {
        0,1,0,
        1,1,0,
        0,1,0
    }
};

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

            for(int k = 0; k < 2; k++) {
                int cursum = 0;
                for(int m = 0; m < 4; m++)
                    for(int l = 0; l < 4; l++) {
                        int curx = i+m;
                        int cury = j+l;

                        if(curx < 0 || curx > N-1 || cury < 0 || cury > M-1 || one[k][m][l] == 0) continue;
                        cursum += board[curx][cury];
                    }
                ans = max(ans, cursum);
            }


            int cursum = 0;
            for(int m = 0; m < 2; m++)
                for(int l = 0; l < 2; l++) {
                    int curx = i+m;
                    int cury = j+l;

                    if(curx < 0 || curx > N-1 || cury < 0 || cury > M-1 || two[m][l] == 0) continue;
                    cursum += board[curx][cury];
            }
            ans = max(ans, cursum);


            for(int k = 0; k < 16; k++) {
                int cursum = 0;
                for(int m = 0; m < 3; m++)
                    for(int l = 0; l < 3; l++) {
                        int curx = i+m;
                        int cury = j+l;

                        if(curx < 0 || curx > N-1 || cury < 0 || cury > M-1) continue;
                        if(k<8 && three[k][m][l] == 0) continue;
                        else if(k >= 8 && k < 12 && four[k%4][m][l] == 0) continue;
                        else if(k >= 12 && k < 16 && five[k%4][m][l] == 0) continue;

                        cursum += board[curx][cury];
                    }
                ans = max(ans, cursum);
            }

        }
    cout<<ans;
    return 0;
}

 

반응형

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

백준 15683 감시  (0) 2020.04.20
백준 14890 경사로  (0) 2020.04.19
백준 12100 2048(Easy)  (0) 2020.04.18
백준 18809 Gaaaaaaaaaarden  (2) 2020.03.23
백준 18808 스티커 붙이기  (0) 2020.03.23