Party Lamps
IOI 98
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.
题意:给你最终每盏灯的状态,问有多少种这样的状态。
后面的灯状态和前面6盏灯的状态是循环重复的,所以算出前6盏灯的所有状态,因为每个按钮只有按或者不按两种选择,所以所有可能只有2^4=16种,再把重复的去掉,就只剩8种。
看了别人的代码。。原来可以先打表的org。
然后记得为0的时候特判一下。
/*
ID:iam666
PROG:lamps
LANG:C++
*/
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <vector>
using namespace std;
int N;
int C;
int tmp;
vector <int> on;
vector <int> off;
vector <int> ans;
int lamp[8][6]={
{0,0,0,0,0,0},
{0,0,1,1,1,0},
{0,1,0,1,0,1},
{0,1,1,0,1,1},
{1,0,0,1,0,0},
{1,0,1,0,1,0},
{1,1,0,0,0,1},
{1,1,1,1,1,1},
};//final lamp
bool check(int row)
{
for(int i=0;i<on.size();i++)
{
if(!lamp[row][(on[i]%6)-1])
return false;
}
for(int i=0;i<off.size();i++)
{
if(lamp[row][(off[i]%6)-1])
return false;
}
return true;
}
int main (void)
{
freopen("lamps.in","r",stdin);
freopen("lamps.out","w",stdout);
//printf("helaaaalo\n");
cin>>N;
cin>>C;
//int tmp;
//cin>>tmp;
// printf("%d %d %d\n",N,C,tmp);
while(1)
{
scanf("%d",&tmp);
// printf("%d\n",tmp);
if(tmp==-1)
break;
if(tmp!=-1)
{
on.push_back(tmp);
// printf("on\n");
}
}
while(1)
{
scanf("%d",&tmp);
if(tmp!=-1)
{
off.push_back(tmp);
// printf("off\n");
}
else
break;
}
// printf("%d %d\n",on.size(),off.size());
if(C>0)
{
for(int i=0;i<8;i++)
{
if(check(i))
ans.push_back(i);
}
if(ans.empty())
printf("IMPOSSIBLE\n");
else
{
for(int i=0;i<ans.size();i++)
{
for(int j=0;j<N;j++)
printf("%d",lamp[ans[i]][j%6]);
printf("\n");
}
}
}
if(C==0)
{
if(check(7))
ans.push_back(7);
if(ans.empty())
printf("IMPOSSIBLE\n");
else
for(int i=0;i<ans.size();i++)
{
for(int j=0;j<N;j++)
{
printf("%d",lamp[ans[i]][j%6]);
}
printf("\n");
}
}
return 0;
}