AcWing 1367. 派对的灯
原题链接
中等
作者:
ywt51
,
2024-11-19 14:24:51
,
所有人可见
,
阅读 1
//枚举4个按键是否按下,二进制枚举,取出4位二进制的每一位代表4个按键是否按下
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n, c, x, st[110] = {}, deng[110] = {};
vector<string> res;
memset(deng, -1, sizeof deng);
cin >> n >> c;
while (cin >> x, x != -1) deng[x] = 1;
while (cin >> x, x != -1) deng[x] = 0; //
//二进制枚举
for (int i = 0; i < 1<<4; ++ i)
{
int a[4], s = 0; //取出4个按键是否按下了
for (int j = 0; j < 4; ++ j)
a[j] = (i >> j & 1);
s = (a[0] + a[1] + a[2] + a[3]);
//4个按钮的操作次数和c 奇偶不同 或 次数超c 跳过 这种操作序列是不可能的
if (s % 2 != c % 2 || s > c) continue;
//初始化灯的状况 打开的
for (int j = 1; j <= n; ++ j) st[j] = 1;
if (a[0])
for (int j = 1; j <= n; ++ j) st[j] ^= 1; //按1了
if (a[1])
for (int j = 1; j <= n; j += 2) st[j] ^= 1; //按键2 操作了
if (a[2])
for (int j = 2; j <= n; j += 2) st[j] ^= 1;
if (a[3])
for (int j = 1; j <= n; j += 3) st[j] ^= 1;
//判断st 是否 和输入的灯的状态完全匹配
string t = "";
bool f = 1; //默认是合法的
for (int j = 1; j <= n; ++ j)
{
t = t + char(st[j] + '0'); //拼接所有灯的 状态
if (deng[j] != -1 && deng[j] != st[j])
{
f = 0;
break;
}
}
if (f) res.push_back(t);
}
if (res.size() == 0)
{
cout << "IMPOSSIBLE\n";
return 0;
}
sort(res.begin(), res.end());
for (string x : res) cout << x << endl;
return 0;
}