题意:
相信大家都知道题意
思路
这道题,如果u,r,d,l都<=n-2,那么则是YES.如果一个边要求涂n个,那么它的两个邻边>=1, 如果要求涂n-1个,那么它的两个邻边至少一个>=1,
我们采用dfs枚举,即可
这里的u,r,d,l,采用数组来存,更加方便
如果还没懂,可以看看代码,很容易懂的
AC代码
#include<bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define ll long long
#define ull unsigned long long
#define IOS ios::sync_with_stdio(0),cin.tie(0)
#define gcd(a,b) __gcd(a,b)
#define ft first
#define sd second
#define endl '\n'
#define PI acos(-1.0)
//inline void print(__int128 x)
//{
// if(x<0) {putchar('-'); x=-x;}
// if(x>9) print(x/10);
// putchar(x%10+'0');
//}
int a[10],n,flag,b[10];
void dfs(int i)
{
if(i==4)
{
//for(int i=0; i<4; i++) cout<<a[i]<<" "<<b[i]<<endl;
if(a[1]>=b[1]&&a[0]>=b[0]&&a[2]>=b[2]&&a[3]>=b[3]) flag=1;
return ;
}
if(a[i]==n)
{
b[(i+1)%4]++;
b[(i-1+4)%4]++;
dfs(i+1);
b[(i+1)%4]--;
b[(i-1+4)%4]--;
}
else if(a[i]==n-1)
{
b[(i+1)%4]++;
dfs(i+1);
b[(i+1)%4]--;
b[(i-1+4)%4]++;
dfs(i+1);
b[(i-1+4)%4]--;
}
else dfs(i+1);
}
int main()
{
int t;
cin>>t;
while(t--)
{
flag=0;
mem(b,0);
scanf("%d",&n);
for(int i=0; i<4; i++)
{
scanf("%d",a+i);
}
dfs(0);
if(flag) puts("YES");
else puts("NO") ;
}
return 0;
}