按一個按鈕兩次至關於沒按,每一個按鈕按或者不按的狀況,一共有2^4=16種狀態。枚舉每一個按鈕是否按下,及時根據按鍵總數終止不可能的狀況,注意按鈕1==按鈕2+按鈕3的做用,所以在c%4==2時注意sum!=1的狀況。雖然燈最多有100盞,但6盞之後的燈都是前6盞的重複,所以只需保存前六盞的狀態。最後對全部合適的狀況排序輸出。ios
/* ID:jzzlee1 PROG:lamps LANG:C++ Dear double_tings: i love you. */ //#include<iostream> #include<fstream> #include<cmath> #include<string> #include<cstring> #include<set> using namespace std; ifstream cin("lamps.in"); ofstream cout("lamps.out"); int n,c,l[100],ll[7],m[100],mm[7];bool ans[100][110]; bool a[7]={0}; set<string> set1; bool check() { int i; for(i=1;i<7;i++) { if(ll[i]==1&&a[i]==0) return 0; if(mm[i]==1&&a[i]==1) return 0; } return 1; } int main() { cin>>n>>c; int i,x; for(i=0;cin>>x&&x!=-1;++i) { l[i]=x; if(x%6) ll[x%6]=1; else ll[6]=1; } for(i=0;cin>>x&&x!=-1;++i) { m[i]=x; if(x%6) mm[x%6]=1; else mm[6]=1; } int count=0,d[5];bool flag=0; for(d[1]=0;d[1]<=1;++d[1]) for(d[2]=0;d[2]<=1;++d[2]) for(d[3]=0;d[3]<=1;++d[3]) for(d[4]=0;d[4]<=1;++d[4]) { int sum=0; for(i=1;i<=4;++i) sum+=d[i]; if(c==0&&sum!=0) continue; else if(c!=0&&c%4==0&&sum!=4&&sum!=2&&sum!=0) continue; else if(c%4==3&&sum!=3&&sum!=1) continue; else if(c%4==2&&sum!=2&&sum!=1&&sum!=0) continue; else if(c%4==1&&sum!=1) continue; for(i=1;i<=6;i++) a[i]=1; if(d[1]) for(i=1;i<7;++i) a[i]=!a[i]; if(d[2]) for(i=1;i<7;i+=2) a[i]=!a[i]; if(d[3]) for(i=2;i<7;i+=2) a[i]=!a[i]; if(d[4]) for(i=1;i<7;i+=3) a[i]=!a[i]; if(check()) { string str; flag=1;a[0]=a[6]; for(i=1;i<=n;++i) str+=a[i%6]+'0'; set1.insert(str); } } set<string>::iterator iter; for(iter=set1.begin();iter!=set1.end();++iter) { cout<<*iter; cout<<endl; } if(!flag) cout<<"IMPOSSIBLE"<<endl; return 0; }