Description
在半年的林大生活里,很多同学喜欢来丹青学习,而丹青教室的灯却总是忽明忽暗,非常不利于我们学(wan)习(you xi),为此,一些同学决定修改丹青的电路。 现在,我们已知一个教室里有m个灯,n个开关,每个灯由其中几个开关控制,对于灯泡i,相关开关为“on”的数量对2取模与pi相同时,该灯泡亮,问: 想要所有的灯泡都亮,开关的“on”和“off”状态有几种组合方式(比如:5个开关中1 2 4号为“on”和3 4号开关为“on”是两种不同的组合方式)
Input
多组输入。 第一行:开关数量n和灯泡数量m 第2行至第m+1行:第一个数字ki是第i个灯泡相关的开关数量,其后是开关编号(1~n) 最后一行:pi每个灯泡亮的状态 数据范围:\( 1≤n,m≤10 1≤ki≤N \) Pi 为0或1 所有输入均为整数。
Output
输出一个整数,表示总的开关组合数量。
Analysis
清晰明了的二进制枚举(深度优先搜索题)只要能够理清楚控制具体灯泡的具体开关数量,(我这里利用结构体加以存储)就可以轻松AC
Accepted Code
/*
* @Author: Gehrychiang
* @LastEditors: Gehrychiang
* @Website: www.yilantingfeng.site
* @E-mail: gehrychiang@aliyun.com
*/
#include <bits/stdc++.h>
using namespace std;
struct $
{
int asc[12]; //开关相关数组,下标记录 1为相关 0为无关
int sta;
};
$ light[12];
int n; //开关数量
int m; //灯泡数量
int main()
{
while (cin >> n >> m)
{
//input
memset(light, 0, sizeof(light));
for (int i = 0; i < m; i++)
{
int tmp; //相关个数
cin >> tmp;
while (tmp--)
{
int xg;
cin >> xg;
light[i].asc[xg] = 1;
}
}
for (int i = 0; i < m; i++)
{
cin >> light[i].sta;
}
//input
int cnt = 0;
for (int i = 0; i < (1 << n); i++) //有n个开关就有2^n中排列
{
int dpkaiguan[12] = {0}; //用来记录每个灯泡对应开关开了的个数
//cout<<"i:"<<i<<endl;
for (int j = 0; j < n; j++)
{
if (i & (1 << j)) //第j为有值,第j个开关为开的状态
{
//cout<<"j:"<<j<<endl;
for (int x = 0; x < m; x++)
{
if (light[x].asc[j + 1] == 1)
{
dpkaiguan[x]++;
}
}
}
}
//检查是否满足题目要求
/*
for (int i = 0; i < m; i++)
{
cout<<dpkaiguan[i]<<" ";
}
cout<<endl;
*/
int liangdengshu = 0;
for (int i = 0; i < m; i++)
{
if (dpkaiguan[i] % 2 == light[i].sta)
{
++liangdengshu;
}
}
if (liangdengshu == m)
{
++cnt;
}
}
cout << cnt << endl;
}
return 0;
}

