开关问题(等级考试 8 级 2023-2-10 T2)

发布时间 2023-03-26 17:54:06作者: 王浩泽

题目

 

 这道题目用暴力即可,两种方法,第一种用的是暴力dfs不用多讲

第二种方法细讲,先开 int s[N]  当s[i]的第j位为1是表示i j相关联,反之不相关连,当然了s[i][i]=1,有点类似邻接矩阵

枚举任意操作开关的⽅案时,也可以使⽤⼆进制数来枚举。具体来说,枚举2到2^n之内的所
有数字,⼀个数字的第i位是1则表⽰操作第i个开关。
程序:
#include<bits/stdc++.h>
using namespace std;
int k,n,m,s,T,v[50]; 
int main()
{
    ios::sync_with_stdio(false);
    cin>>k;
    while(k--)
    {
        s=0;
        T=0;
        memset(v,0,sizeof v);
        cin>>n>>m;
        for(int i=0;i<n;i++)
        {
            int t;
            cin>>t;
            s|=t<<i;
        }
        for(int i=0;i<n;i++)
        {
            int t1;
            cin>>t1;
            T|=t1<<i;
        }
        for(int i=0;i<n;i++) v[i]|=1<<i;
        for(int i=0;i<m;i++)
        {
            int j,k;
            cin>>j>>k;
            if(j==0&&k==0) break;
            j--;
            k--;
            v[j]|=1<<k;
        }
        int num=0;
        for(int i=0;i<(1<<n);i++)
        {
            int t=0;
            for(int j=0;j<n;j++) if((i>>j&1)==1) t^=v[j];
            if((s^t)==T) num++;
        }
        printf("%d\n",num);
    }
    return 0;
}