문제

https://codeforces.com/problemset/problem/1494/B

걸린 시간

- 실패

풀이

C++

#include <bits/stdc++.h>
#define INF 1e9
#define all(c) c.begin(), c.end()
typedef long long ll;
typedef unsigned long long ull;
using namespace std;

bool solve(){
    int n, U, R, D, L;
    cin >> n >> U >> R >> D >> L;
    for(int mask = 0; mask < 16; mask++){
        int rU = U, rR = R, rD = D, rL = L;
        if(mask & 1){
            rU -= 1;
            rL -= 1;
        }
        if(mask & 2){
            rU -= 1;
            rR -= 1;
        }
        if(mask & 4){
            rD -= 1;
            rL -= 1;
        }
        if(mask & 8){
            rD -= 1;
            rR -= 1;
        }
        vector<int> a = {rU, rR, rD, rL};
        if(*min_element(all(a)) >= 0 && *max_element(all(a)) <= n-2) return true;
    }
    return false;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    int tc;
    cin >> tc;
    while(tc--){
        if(solve()) cout << "YES\n";
        else cout << "NO\n";
    }
    return 0;
}

n x n 으로 이루어진 격자가 있다. 상하좌우 가장자리 행과 열에 색칠되어야 할 칸의 개수가 주어질 때, 조건에 맞게 색칠할 수 있는지를 묻는 문제이다.

다른 방향의 가장자리와 공유하는 칸은 네개의 모서리 부분으로, 색칠 여부에 따라 24 개의 경우의 수가 존재한다. 어떻게 모든 경우의 수를 세어야 할 지 감이 잘 오지 않았는데 bitmask 기법을 이용하면 쉽게 확인할 수 있었다.

0부터 15까지 정수를 비트로 생각하여 색칠된 칸(1) 일 경우에만 색칠해야 하는 칸의 개수를 줄여 나간다. 각 경우마다 색칠해야 할 칸의 개수가 모두 0 이상 n-2 이하일 때 solution 이 존재한다고 본다. 음수가 존재하는 경우는 모서리 부분의 영향으로 더 많이 색칠 된 경우, n-2 보다 큰 경우는 모서리가 색칠되어야만 하지만 색칠되지 않은 경우를 뜻한다.

'Codeforces' 카테고리의 다른 글

Codeforces #1491B Minimal Cost  (0) 2021.03.06
Codeforces #1492B Card Deck  (0) 2021.03.05
Codeforces #1494A ABC String  (0) 2021.03.04
Educational Codeforces Round 105 (Rated for Div. 2) A  (0) 2021.03.03
Codeforces #1485A Add and Divide  (0) 2021.03.02

댓글