题意:初始化,所有灯都是亮的,
之后总共只有四种操作
1)所有的灯情况都取反
2)编号为奇数的灯取反
3)编号为偶数的灯取反
4)编号为3*x+1 的灯取反
现在,问,执行了C步操作之后,某些灯的亮的,某些灯的关的,求出所有的灯的可能组合。
题意:
每个按钮按2次和没按效果是一样的。所以每个按钮或者按或者不按,一共有2^4=16种状态。枚举每个按钮是否按下,然后生成结果,排序输出即可(注意判重)。
/* ID: nanke691 LANG: C++ TASK: lamps */ #include<iostream> #include<fstream> #include<string> #include<algorithm> #include<set> using namespace std; int N,C,t1,t2; int on[110]={0},off[110]={0}; set<string> s; void judge(int a,int b,int c,int d) { string str=""; for(int i=1;i<=N;i++) { int t=a; if((i-1)%3==0) t+=d; if(i%2==0) t+=c; else t+=b; if(t%2==0) str+="1"; else str+="0"; } for(int i=0;i<t1;i++) { //cout<<"on"<<' '<<on[i]<<endl; if(str[on[i]-1]=='0') return; } for(int i=0;i<t2;i++) { //cout<<"off"<<' '<<off[i]<<endl; if(str[off[i]-1]=='1') return; } s.insert(str); } int main() { freopen("lamps.in","r",stdin); freopen("lamps.out","w",stdout); int a; cin>>N>>C; cin>>a; t1=0,t2=0; while(a!=-1) { on[t1++]=a; cin>>a; } cin>>a; while(a!=-1) { off[t2++]=a; cin>>a; } for(int i=0;i<2;i++) for(int j=0;j<2;j++) for(int k=0;k<2;k++) for(int l=0;l<2;l++) { int c=i+j+k+l; if(c%2==C%2 && c<=C) judge(i,j,k,l); } set<string>::iterator it=s.begin(); if(s.size()!=0) { for(;it!=s.end();it++) cout<<*it<<endl; } else cout<<"IMPOSSIBLE"<<endl; }