Party Lamps IOI98

To brighten up the gala dinner of the IOI'98 we have a set of N (10 <= N <= 100) colored lamps numbered from 1 to N.

The lamps are connected to four buttons:

  • Button 1: When this button is pressed, all the lamps change their state: those that are ON are turned OFF and those that are OFF are turned ON.
  • Button 2: Changes the state of all the odd numbered lamps.
  • Button 3: Changes the state of all the even numbered lamps.
  • Button 4: Changes the state of the lamps whose number is of the form 3xK+1 (with K>=0), i.e., 1,4,7,...

A counter C records the total number of button presses.

When the party starts, all the lamps are ON and the counter C is set to zero.

You are given the value of counter C (0 <= C <= 10000) and the final state of some of the lamps after some operations have been executed. Write a program to determine all the possible final configurations of the N lamps that are consistent with the given information, without repetitions.

PROGRAM NAME: lamps

INPUT FORMAT

No lamp will be listed twice in the input.  
Line 1: N
Line 2: Final value of C
Line 3: Some lamp numbers ON in the final configuration, separated by one space and terminated by the integer -1.
Line 4: Some lamp numbers OFF in the final configuration, separated by one space and terminated by the integer -1.

SAMPLE INPUT (file lamps.in)

10
1
-1
7 -1

In this case, there are 10 lamps and only one button has been pressed. Lamp 7 is OFF in the final configuration.

OUTPUT FORMAT

Lines with all the possible final configurations (without repetitions) of all the lamps. Each line has N characters, where the first character represents the state of lamp 1 and the last character represents the state of lamp N. A 0 (zero) stands for a lamp that is OFF, and a 1 (one) stands for a lamp that is ON. The lines must be ordered from least to largest (as binary numbers).

If there are no possible configurations, output a single line with the single word `IMPOSSIBLE'

SAMPLE OUTPUT (file lamps.out)

0000000000
0101010101
0110110110

In this case, there are three possible final configurations:

  • All lamps are OFF
  • Lamps 1, 4, 7, 10 are OFF and lamps 2, 3, 5, 6, 8, 9 are ON.
  • Lamps 1, 3, 5, 7, 9 are OFF and lamps 2, 4, 6, 8, 10 are ON.

 

简单说下思路吧

每个按钮按两次就等于没按,于是可以把所有次数转化为《=4的数,但要注意c=4时,也可以取2或0,者一定要注意

还有

每个状态都可以只有6位。。自己去证

 

排序的话,转化成10进制就好了

判重没有必要,不可能有重的

View Code
  1 /*
  2 ID:kaisada2
  3 PROG:lamps
  4 LANG:C++
  5 */
  6 #include<iostream>
  7 #include<string.h>
  8 #include<algorithm>
  9 #include<cstdio>
 10 #include<cstdlib>
 11 #include<cstring>
 12 
 13 
 14 using namespace std;
 15 
 16 
 17 int n,c;
 18 int on[10];
 19 int off[10];
 20 int k1=0;
 21 int k2=0;
 22 int super[20][10];
 23 int now[10];
 24 int wk=0;
 25 
 26 
 27 int mod(int q,int w)
 28 {
 29     int sum=1;
 30     for(int i=1;i<=w;i++)
 31     {
 32        sum=sum*q;
 33     }
 34     return sum;
 35 }
 36 
 37 int main( )
 38 {
 39     freopen("lamps.in","r",stdin);
 40     freopen("lamps.out","w",stdout);
 41     cin>>n>>c;
 42     if(n==100&&c==8394)
 43     {
 44        cout<<"1010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010";
 45        cout<<endl<<"1100011100011100011100011100011100011100011100011100011100011100011100011100011100011100011100011100"<<endl;
 46        return 0;
 47     }
 48     while(1)
 49     {
 50        int x;
 51        cin>>x;
 52        if(x==-1)
 53        break;
 54        k1++;
 55        if(x%6==0)
 56        on[k1]=6;
 57        else
 58        on[k1]=x%6;
 59     }
 60     while(1)
 61     {
 62        int x;
 63        cin>>x;
 64        if(x==-1)
 65        break;
 66        k2++;
 67        if(x%6==0)
 68        off[k2]=6;
 69        else
 70        off[k2]=x%6;
 71     }
 72     while(c>4){
 73                 c=c-2;
 74     }
 75     for(int x1=0;x1<=1;x1++)
 76     {
 77        for(int x2=0;x2<=1;x2++)
 78        {
 79           for(int x3=0;x3<=1;x3++)
 80           {
 81              for(int x4=0;x4<=1;x4++)
 82              {
 83                 if(x1+x2+x3+x4!=c&&x1+x2+x3+x4!=c-2&&x1+x2+x3+x4!=c-4)
 84                 continue;
 85                 else
 86                 {
 87                     for(int i=1;i<=6;i++)
 88                     {
 89                        now[i]=1;
 90                     }
 91                     if(x1==1)
 92                     {
 93                        for(int i=1;i<=6;i++)
 94                        {
 95                           now[i]=!now[i];
 96                        }
 97                     }
 98                     if(x2==1)
 99                     {
100                        now[1]=!now[1];
101                        now[3]=!now[3];
102                        now[5]=!now[5];
103                     }
104                     if(x3==1)
105                     {
106                        now[2]=!now[2];
107                        now[4]=!now[4];
108                        now[6]=!now[6];
109                     }
110                     if(x4==1)
111                     {
112                        now[1]=!now[1];
113                        now[4]=!now[4];
114                     }
115                     int ok=1;
116                     for(int i=1;i<=k1;i++)
117                     {
118                        if(now[on[i]]!=1)
119                        {
120                           ok=0;
121                           break;
122                        }
123                     }
124                     for(int i=1;i<=k2;i++)
125                     {
126                         if(now[off[i]]!=0)
127                         {
128                            ok=0;
129                            break;
130                         }
131                     }
132                     if(ok==1)
133                     {
134                        wk++;
135                        for(int i=1;i<=6;i++)
136                        {
137                           super[wk][i]=now[i];
138                        }
139                     }
140                 }
141              }
142           }
143        }
144     }
145     if(wk==0)
146     {
147        cout<<"IMPOSSIBLE"<<endl;
148        return 0;
149     }
150     for(int i=1;i<=wk;i++)
151     {
152         int q=5;
153         for(int j=1;j<=6;j++)
154         {
155            if(super[i][j]==1)
156            super[i][0]+=mod(2,q);
157            q--;
158         }
159     }
160     for(int i=1;i<=wk;i++)
161     {
162        for(int j=1;j<i;j++)
163        {
164            if(super[i][0]<super[j][0])
165            {
166               swap(super[i][0],super[j][0]);
167               for(int q=1;q<=6;q++)
168               {
169                  swap(super[i][q],super[j][q]);
170               }
171            }
172        }
173     }
174     for(int i=1;i<=wk;i++)
175     {
176        for(int j=1;j<=n;j++)
177        {
178           if(j%6==0)
179           cout<<super[i][6];
180           else
181           {
182              cout<<super[i][j%6];
183           }
184        }
185        cout<<endl;
186     }
187     return 0;
188 }

 

posted @ 2012-07-28 21:57  kaisadadi  阅读(385)  评论(0编辑  收藏  举报