本来是蛮简单的题,但是没想到要按大小排序……所以取了点巧。有空会再研究下更好的方法。因为只可能有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 }

 

posted on 2012-07-23 16:37  醉春雨  阅读(128)  评论(0)    收藏  举报