有n盏灯,4种按钮,在C步后达到某些灯开,某些灯关。关键在于每个按钮按偶数次后相当于没按,按奇数次后相当于按一次,所以灯只有2^4=16种情况,先枚举出来,然后判断哪些符合要求并排序,最后输出 #include<iostream> #include<fstream> #include<string> #include<memory.h> #include<cstdio> #include<cmath> #include<algorithm> #include<queue> #include<vector> using namespace std; struct node{ int val[101]; }; ifstream fin("lamps.in"); ofstream fout("lamps.out"); int n,c; int lon[101],pi_on=0; int loff[101],pi_off=0; int state[17][101],sta[101],x[4][101],now[101],y[17][4],ynow[4]; int psi=0; node res[17]; int ri=0; int cmp(const void * a,const void * b){ struct node *aa=(node *)a; struct node *bb=(node *)b; for(int i=0;i<n;i++){ if(aa->val[i]-bb->val[i]>0) return 1; if(aa->val[i]-bb->val[i]<0) return -1; } return -1; } void tran(int dep){ for(int i=0;i<n;i++){ now[i]=now[i]^x[dep][i]; } } void make(int dep){ if(dep==4){ for(int i=0;i<n;i++) state[psi][i]=now[i]; for(int j=0;j<4;j++) y[psi][j]=ynow[j]; psi++; return; } make(dep+1); tran(dep); ynow[dep]=1; make(dep+1); tran(dep); ynow[dep]=0; } void init(){ memset(x,0,sizeof(x)); for(int i=1;i<=n;i++){ x[0][i-1]=1; if(i%2) x[1][i-1]=1; if(i%2==0) x[2][i-1]=1; if((i-1)%3==0) x[3][i-1]=1; } } bool check(int pj){ int tt=c; for(int i=0;i<4;i++) tt-=y[pj][i]; if(tt>=0 && tt%2==0) return true; else return false; } int main(){ fin>>n>>c; int a; while(fin>>a){ if(a==-1) break; lon[pi_on++]=a; } while(fin>>a){ if(a==-1) break; loff[pi_off++]=a; } init(); for(int i=0;i<n;i++) now[i]=1; memset(ynow,0,sizeof(ynow)); make(0); bool flag=false; for(int j=0;j<psi;j++){ bool f1=true; for(int p=0;p<pi_on;p++) { if(state[j][lon[p]-1]==0){ f1=false; break; } } for(int q=0;q<pi_off;q++){ if(state[j][loff[q]-1]==1){ f1=false; break; } } if(check(j) && f1){ for(int k=0;k<n;k++){ res[ri].val[k]=state[j][k]; } ri++; flag=true; } // for(int k=0;k<n;k++) fout<<state[j][k]; // fout<<endl; } qsort(res,ri,sizeof(res[0]),cmp); if(!flag) fout<<"IMPOSSIBLE"<<endl; else{ for(int i1=0;i1<ri;i1++){ for(int i2=0;i2<n;i2++){ fout<<res[i1].val[i2]; } fout<<endl; } } return 0; }