CF 1494 B
(思考题解花了一顿饭的时间)
首先明确这几个事情:
- 只需要考虑四个角落的01全排列(涂色或者不涂色)
- 一共种情况,完全够穷举,时间复杂度与 n 无关
- 减去四个角落上的黑块后,每边的黑块数量 满足
- 对于每一组给定的数,只要有一种解就可以输出YES
对于穷举,除了用四重for()
循环嵌套外,还可以用0~15的数字配合位运算
下面给出一种思路,使用位运算:
#include<iostream>
#include<algorithm>
using namespace std;
void solve()
{
int n, D, U, L, R;
cin >> n >> U >> R >> D >> L;
for (int i = 0; i < 16; i ++ ) // 枚举四个角上的不同情况,共2^4 = 16种
{
int uu = U, rr = R, ll = L, dd = D; // 复制一下原状态
if (i & 1) uu -- , ll -- ; // 如果把左上角涂黑
if (i & 2) uu -- , rr -- ; // 如果把右上角涂黑
if (i & 4) dd -- , ll -- ; // 左下角
if (i & 8) dd -- , rr -- ; // 右下角
if (uu >= 0 && ll >= 0 && rr >= 0 && dd >= 0 && uu <= n - 2 && ll <= n - 2 && dd <= n - 2 && rr <= n - 2) // 保证每边 > 0 && < n - 2
{
cout << "YES" << endl; // 一旦有成功样例就退出
return;
}
}
cout << "NO" << endl;
return;
}
int main()
{
int t;
cin >> t;
while(t -- )
{
solve();
}
return 0;
}