本来是蛮简单的题,但是没想到要按大小排序……所以取了点巧。有空会再研究下更好的方法。因为只可能有16种可能,所以枚举就可以了。下面贴出代码,以作纪念。
View Code
1 /*{ 2 ID:jzy3209981 3 PROG:lamps 4 LANG:C++ 5 }*/ 6 #include<stdio.h> 7 #include<iostream> 8 #include<string.h> 9 #include<math.h> 10 using namespace std; 11 12 bool lamb[110]; 13 int off[110]; 14 int on[110]; 15 int main() 16 { 17 freopen ("lamps.in","r",stdin); 18 freopen ("lamps.out","w",stdout); 19 int n,c,flamb=0,p,po,j,counter,i,onn=0,offn=0,state,poss=0; 20 int order[16]={1,6,11,12,2,5,8,15,9,14,3,4,10,13,0,7}; 21 scanf("%d%d",&n,&c); 22 scanf("%d",&flamb); 23 while(flamb!=-1) 24 { 25 on[onn]=flamb; 26 onn++; 27 scanf("%d",&flamb); 28 } 29 scanf("%d",&flamb); 30 while(flamb!=-1) 31 { 32 off[offn]=flamb; 33 offn++; 34 scanf("%d",&flamb); 35 } 36 for(i=0;i<=15;i++) 37 { 38 memset(lamb,1,sizeof(lamb)); 39 state=0; 40 po=order[i]; 41 counter=0; 42 while(po!=0) 43 { 44 p=po&-po; 45 po-=p; 46 switch(p) 47 { 48 case 1: 49 for(j=1;j<=n;j++) 50 lamb[j]=!lamb[j]; 51 break; 52 case 2: 53 for(j=1;j<=n;j+=2) 54 lamb[j]=!lamb[j]; 55 break; 56 case 4: 57 for(j=2;j<=n;j+=2) 58 lamb[j]=!lamb[j]; 59 break; 60 case 8: 61 for(j=1;j<=n;j+=3) 62 lamb[j]=!lamb[j]; 63 break; 64 } 65 counter++; 66 } 67 for(j=0;j<onn;j++) 68 { 69 if(lamb[on[j]]==0) 70 { 71 state=1; 72 break; 73 } 74 } 75 if(state==1) 76 continue; 77 for(j=0;j<offn;j++) 78 { 79 if(lamb[off[j]]==1) 80 { 81 state=1; 82 break; 83 } 84 } 85 if(state==1) 86 continue; 87 if((c-counter)%2==0&&c-counter>=0) 88 { 89 for(j=1;j<=n;j++) 90 { 91 if(j!=n) 92 printf("%d",lamb[j]); 93 else 94 printf("%d\n",lamb[j]); 95 } 96 poss=1; 97 } 98 } 99 if(poss==0) 100 printf("IMPOSSIBLE\n"); 101 return 0; 102 }

浙公网安备 33010602011771号