ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [14500] 테트로미노
    BOJ 2022. 4. 22. 15:32

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

     

    14500번: 테트로미노

    폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된다. 도형은 모두 연결되어 있어야 한다. 정사각형의 변

    www.acmicpc.net

    일자형만 제외하면 3*2의 직사각형에서 2개만 제외하여 만들 수 있다.

    일자형은 별도로 계산하고, 직사각형에서 2개씩 빼준 값을 업데이트 하는 방식으로 구현했다.


    #include <bits/stdc++.h>
    using namespace std;
    #ifdef ONLINE_JUDGE
    constexpr bool local = false;
    #else
    constexpr bool local = true;
    #endif
    using ll = long long;
    using pi = pair<ll, ll>;
    int n, m, ans, a[505][505];
    void f(int c) { ans = max(c, ans); }
    int main(void) {
        if (!local) ios_base::sync_with_stdio(0), cin.tie(0);
        int i, j;
        cin >> n >> m;
        for (i = 0; i < n; i++)
            for (j = 0; j < m; j++) cin >> a[i][j];

        for (i = 0; i < n; i++)
            for (j = 0; j + 3 < m; j++)
                f(a[i][j] + a[i][j + 1] + a[i][j + 2] + a[i][j + 3]);
        for (i = 0; i + 3 < n; i++)
            for (j = 0; j < m; j++)
                f(a[i][j] + a[i + 1][j] + a[i + 2][j] + a[i + 3][j]);

        for (i = 0; i + 1 < n; i++) {
            for (j = 0; j + 2 < m; j++) {
                int sum = a[i][j] + a[i][j + 1] + a[i][j + 2] + a[i + 1][j] +
                          a[i + 1][j + 1] + a[i + 1][j + 2];
                f(sum - a[i][j] - a[i + 1][j]);
                f(sum - a[i][j + 2] - a[i + 1][j + 2]);

                f(sum - a[i][j] - a[i][j + 1]);
                f(sum - a[i + 1][j] - a[i + 1][j + 1]);
                f(sum - a[i][j + 1] - a[i][j + 2]);
                f(sum - a[i + 1][j + 1] - a[i + 1][j + 2]);

                f(sum - a[i][j] - a[i + 1][j + 2]);
                f(sum - a[i + 1][j] - a[i][j + 2]);

                f(sum - a[i][j] - a[i][j + 2]);
                f(sum - a[i + 1][j] - a[i + 1][j + 2]);
            }
        }

        for (i = 0; i + 2 < n; i++) {
            for (j = 0; j + 1 < m; j++) {
                int sum = a[i][j] + a[i][j + 1] + a[i + 1][j] + a[i + 1][j + 1] +
                          a[i + 2][j] + a[i + 2][j + 1];
                f(sum - a[i][j] - a[i][j + 1]);
                f(sum - a[i + 2][j] - a[i + 2][j + 1]);

                f(sum - a[i][j] - a[i + 1][j]);
                f(sum - a[i][j + 1] - a[i + 1][j + 1]);
                f(sum - a[i + 1][j] - a[i + 2][j]);
                f(sum - a[i + 1][j + 1] - a[i + 2][j + 1]);

                f(sum - a[i][j] - a[i + 2][j + 1]);
                f(sum - a[i][j + 1] - a[i + 2][j]);

                f(sum - a[i][j] - a[i + 2][j]);
                f(sum - a[i][j + 1] - a[i + 2][j + 1]);
            }
        }
        cout << ans;
        return 0;
    }

     

    'BOJ' 카테고리의 다른 글

    [2784] 가로 세로 퍼즐  (0) 2022.04.27
    [1107] 리모컨  (0) 2022.04.25
    [3584] 가장 가까운 공통 조상  (0) 2022.04.15
    [12789] 도키도키 간식드리미  (0) 2022.04.12
    [3787] Count on Canton  (0) 2022.04.09

    댓글