Educación Codeforces Ronda 105 (Clasificado para Div. 2) B. Berland Crucigrama 题解

significado del titulo

Da cinco números n, U, R, D, L n, U, R, D, Ln , U , R , D , L , representando unn × nn \times nnorte×El número de celdas negras en la capa superior de la cuadrícula de n ( U ) ( U )( U ) , el número de cuadrados negros en la columna más a la derecha( R ) ( R )( R ) , el número de cuadrados negros en la capa más baja( D ) ( D )( D ) y el número de cuadrados negros en la columna más a la izquierda( L ) ( L )( L ) . Averigüe si existe tal cuadrícula.

ideas

Todas las decisiones posibles para la cuadrícula en las cuatro esquinas están presentes. Todas las enumeraciones posibles para una cuadrícula de cuatro esquinas se pueden hacer con bitset bitsetb i t s e t para lograr.

Código aceptado

/*
 * @Autor: CofDoria
 * @Date: 2021-03-06 09:43:23
 * @LastEditTime: 2021-03-06 14:23:21
 */
#include <bits/stdc++.h>
using namespace std;

#define db double
#define ll long long
#define inf 0x3f3f3f3f
#define s(a, n) memset(a, n, sizeof(a))
#define debug(a) cout << '#' << a << '#' << endl
#define rep(l, a, b) for (register ll l = a; l < b; ++l)
#define per(l, a, b) for (register ll l = a; l >= b; --l)
#define _ios ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define _forit(i, c) \
    for (__typeof__((c).begin()) i = (c).begin(); i != (c).end(); ++i)

bool fi = true;
const unsigned long long MOD = 1e9 + 7;

inline ll gcd(ll a, ll b) {
    
     return (b == 0 ? a : gcd(b, a % b)); }

int t, n, u, r, d, l, s;
bool ok;

bool f(int x, int l, int r) {
    
    
    if (l) --x; // 右边顶角存在黑格,传入值减一
    if (r) --x; // 左边同理
    if (x >= 0 && x <= n - 2) return true; // 判断是否合法
    return false;
}

int main() {
    
    
    // freopen("in.txt", "r", stdin);
    // freopen("out.txt", "w", stdout);
    _ios;
    cin >> t;
    while (t--) {
    
    
        cin >> n >> u >> r >> d >> l;
        s = 0;
        ok = false;
        for (; s < (1 << 4); ++s) {
    
    
            bitset<4> b(s); // 将s按二进制的每位数填入b数组
            // 不合法就进入下一循环,即下一种情况的枚举
            if (!f(u, b[0], b[1])) continue;
            if (!f(r, b[1], b[2])) continue;
            if (!f(d, b[2], b[3])) continue;
            if (!f(l, b[3], b[0])) continue;
            // 合法即标记,并退出循环
            ok = true;
            break;
        }
        if (ok)
            puts("YES");
        else
            puts("NO");
    }
    // fclose(stdin);
    // fclose(stdout);
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/qq_46144509/article/details/114440733
Recomendado
Clasificación