USACO2.2 Party Lamps(lamps)

        按一个按钮两次相当于没按,每个按钮按或者不按的情况,一共有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;
}

你可能感兴趣的:(USACO)