Educational Codeforces Round 105 (Rated for Div. 2) B. Berland Crossword ——赛后题解

题目链接

题意:

相信大家都知道题意

思路

这道题,如果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;
 } 

posted @ 2022-08-28 08:43  翔村亲亲鸟  阅读(12)  评论(0编辑  收藏  举报