开关问题(等级考试 8 级 2023-2-10 T2)
题目
这道题目用暴力即可,两种方法,第一种用的是暴力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; }