二进制枚举的一道较难题目

nefu2082

二进制枚举的一道较难题目_第1张图片
二进制枚举的一道较难题目_第2张图片

这题好坑,考试的时候没错出来,泪崩

这题属于二进制枚举中较难的题目了,反正我是这么觉得,当时没想到用结构体,而且考试又紧张,搞得一堆东西分不清谁是谁

以后条件复杂的题目一定要把每个变量的含义写清楚,方便后续查bug

#include 

using namespace std;
struct node//用结构体将相关的东西存在一起
{
    int k;//每个灯泡被控制的开关的数量
    int a[15];//控制灯泡的开关的编号依次存入
    int state;//题目要求的每个灯泡的状态
}s[15];

int main()
{
    int n,m,flag,b[15];
    int t,len,count,sum;
    while(cin>>n>>m)
    {
        int ans=0;
        for(int i=0;i<m;i++)
        {
            cin>>s[i].k;
            for(int j=0;j<s[i].k;j++)cin>>s[i].a[j];//控制灯泡的开关编号存起来
        }
        for(int i=0;i<m;i++)cin>>s[i].state;
        for(int i=0;i<(1<<n);i++)
        {
            memset(b,0,sizeof(b));
            for(int j=0;j<n;j++)
            {
                if(i&(1<<j))b[j+1]=1;//用数组模拟每一种情况的开关
            }
            flag=1;
            for(int j=0;j<m;j++)
            {
                sum=0;

                for(int k=0;k<s[j].k;k++)
                {
                    if(b[s[j].a[k]]==1)sum++;//查找开关的状态,并得出开了几个开关
                }
                if(sum%2!=s[j].state){flag=0;break;}//开关状态不符合题意的情况直接舍弃掉
            }
            if(flag==1)ans++;
        }
        cout<<ans<<endl;
    }
    return 0;
}

你可能感兴趣的:(二进制枚举的一道较难题目)