2019独角兽企业重金招聘Python工程师标准>>>
按一个按钮两次相当于没按,每个按钮按或者不按的情况,一共有2^4=16种状态。枚举每个按钮是否按下,及时根据按键总数终止不可能的情况,注意按钮1==按钮2+按钮3的作用,因此在c%4==2时注意sum!=1的情况。虽然灯最多有100盏,但6盏以后的灯都是前6盏的重复,因此只需保存前六盏的状态。最后对所有合适的情况排序输出。
/*
ID:jzzlee1
PROG:lamps
LANG:C++
Dear double_tings:
i love you.
*/
//#include<iostream>
#include<fstream>
#include<cmath>
#include<string>
#include<cstring>
#include<set>
using namespace std;
ifstream cin("lamps.in");
ofstream cout("lamps.out");
int n,c,l[100],ll[7],m[100],mm[7];bool ans[100][110];
bool a[7]={0};
set<string> set1;
bool check()
{
int i;
for(i=1;i<7;i++)
{
if(ll[i]==1&&a[i]==0)
return 0;
if(mm[i]==1&&a[i]==1)
return 0;
}
return 1;
}
int main()
{
cin>>n>>c;
int i,x;
for(i=0;cin>>x&&x!=-1;++i)
{
l[i]=x;
if(x%6)
ll[x%6]=1;
else ll[6]=1;
}
for(i=0;cin>>x&&x!=-1;++i)
{
m[i]=x;
if(x%6)
mm[x%6]=1;
else mm[6]=1;
}
int count=0,d[5];bool flag=0;
for(d[1]=0;d[1]<=1;++d[1])
for(d[2]=0;d[2]<=1;++d[2])
for(d[3]=0;d[3]<=1;++d[3])
for(d[4]=0;d[4]<=1;++d[4])
{
int sum=0;
for(i=1;i<=4;++i)
sum+=d[i];
if(c==0&&sum!=0)
continue;
else if(c!=0&&c%4==0&&sum!=4&&sum!=2&&sum!=0)
continue;
else if(c%4==3&&sum!=3&&sum!=1)
continue;
else if(c%4==2&&sum!=2&&sum!=1&&sum!=0)
continue;
else if(c%4==1&&sum!=1)
continue;
for(i=1;i<=6;i++)
a[i]=1;
if(d[1])
for(i=1;i<7;++i)
a[i]=!a[i];
if(d[2])
for(i=1;i<7;i+=2)
a[i]=!a[i];
if(d[3])
for(i=2;i<7;i+=2)
a[i]=!a[i];
if(d[4])
for(i=1;i<7;i+=3)
a[i]=!a[i];
if(check())
{
string str;
flag=1;a[0]=a[6];
for(i=1;i<=n;++i)
str+=a[i%6]+'0';
set1.insert(str);
}
}
set<string>::iterator iter;
for(iter=set1.begin();iter!=set1.end();++iter)
{
cout<<*iter;
cout<<endl;
}
if(!flag)
cout<<"IMPOSSIBLE"<<endl;
return 0;
}