cf-1494B

题目

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

思路

四个角是关键要素:

  1. 不需要填角时直接true
  2. 暴力枚举所有情况(每个角填或不填)

代码

    //四个角可以一个当两个  只要角被填了, 与之对应的必须要被填
    //都不用填角的话直接可以
    #include <iostream>
    #include <cstring>
    #include <algorithm>
     
    using namespace std;
    int n, a[4], T;
     
    //不需要用到角落, 直接填
    bool r()
    {
        for(int i = 0; i < 4; ++ i) if(a[i] > n - 2) return false;
        
        return true;
    }
     
    bool cc(int x)
    {
        return x >= 0 && x <= n - 2;
    }
     
    bool check()
    {
        if(r()) return true;
        int b[4];
        //必须要用到角
        //枚举用四个点, 只要有一种true
        for(int i = 0; i < 2; ++ i)
        {
            for(int j = 0; j < 2; ++ j)
            {
                for(int k = 0; k < 2; ++ k)
                {
                    for(int p = 0; p < 2; ++ p)
                    {
                        //不能在原数组上操作
                        memcpy(b, a, sizeof a);
                        if(i) b[0] --, b[1] --;
                        if(j) b[0] --, b[3] --;
                        if(k) b[1] --, b[2] --;
                        if(p) b[2] --, b[3] --;
                        int flag = 1;
                        for(int q = 0; q < 4; ++ q)
                        {
                            flag &= cc(b[q]);
                        }
                        if(flag)
                        {
                            return true;
                        }
                    }
                }
            }
        }
        
        return false;
    }
     
    int main()
    {
        cin >> T;
        while(T --)
        {
            cin >> n;
            for (int i = 0; i < 4; i ++ ) cin >> a[i];
            if(check()) puts("YES");
            else puts("NO");
        }
        
        return 0;
    }
posted @ 2021-11-29 17:01  birds_fly  阅读(45)  评论(0)    收藏  举报