您的位置:首页 > 其它

USACO 2.2.4 Party Lamps

2015-10-01 14:07 351 查看
注意有状态重复,所以实际需要统计的状态并不多

以及有效按钮数<=4

#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
//#define LOCAL

using namespace std;

#ifdef LOCAL
ofstream fout ("out.txt");
ifstream fin ("in.txt");
#else
ofstream fout ("lamps.out");
ifstream fin ("lamps.in");
#endif

int res[1<<10]; // save the state
int num_on = 0;
int num_off = 0;
int on[10];
int off[10];
int used[1000];
int num_light;
int num_change;
int num_res = 0;

int change1(int s)
{
s = s^((1<<6)-1);
return s;
}

int change2(int s)
{
s = s^(052);
return s;
}

int change3(int s)
{
s = s^(025);
return s;
}

int change4(int s)
{
s = s^(044);
return s;
}

int max_s = -1;

bool check(int state)
{
//max_s = max(max_s, state);
if(used[state]==1)
return 0;
for (int i = 0; i < num_on; ++i)
{
if((state&(1<<(6 - on[i])))==0)
return 0;
}
for (int i = 0; i < num_off; ++i)
{
if((state&(1<<(6 - off[i])))!=0)
return 0;
}
return 1;
}

void dfs(int now, int state)
{
if(now==num_change)
{
if(check(state))
{
res[num_res++] = state;
used[state] = 1;
}
return;
}
dfs(now+1, change1(state));
dfs(now+1, change2(state));
dfs(now+1, change3(state));
dfs(now+1, change4(state));
}

bool cmp(const int &a, const int &b)
{
return a < b;
}

int main() {

fin >> num_light >> num_change;

while(num_change>4)
num_change -= 2;

int temp;
while(1)
{
fin >> temp;
if(temp==-1)
break;

if(temp%6==0)
temp = 6;
else
temp = temp%6;

on[num_on++] = temp;
}

temp = 1;
while(1)
{
fin >> temp;
if(temp==-1)
break;
if(temp%6==0)
temp = 6;
else
temp = temp%6;

off[num_off++] = temp;
}

int now = (1<<6) - 1;
dfs(0, now);
//cout<<now<<endl;
//cout<<max_s<<endl;//

if(num_res==0)
{
fout<<"IMPOSSIBLE\n";
return 0;
}

sort(res, res+num_res, cmp);

// for (int i = 0; i < num_res; ++i)
// {
// 	fout<<res[i]<<endl;
// }

for (int i = 0; i < num_res; ++i)
{
int temp = res[i];
int t = 0;
for (int j = 0; ; ++j)
{
if(t==num_light)
break;
if(t%6==0)
j = 0;
if((temp&(1<<(5-j)))!=0)
fout<<1;
else
fout<<0;
t++;
}
fout<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: