亂七八糟的寫 改着改着就這麼過了。。dfs枚舉 可以看出每個串前六位跟後面的都是一樣的 比較不同也就看前6位就可以了
/*
ID: your_id_here
PROG: lamps
LANG: C++
*/
#include <iostream>
#include<cstdio>
#include<stdlib.h>
#include<algorithm>
#include<cstring>
using namespace std;
int f[10],n,c,on[110],of[110],g1,g2;
char str[110],ss[110],si[1000][10],w;
int Comp(const void *p1,const void *p2)
{
return strcmp((char *)p1,(char *)p2);
}
int judge(char *sw)
{
int i;
for(i = 1 ; i <= g1 ; i++)
{
if(sw[(on[i]-1+6)%6]=='0')
return 0;
}
for(i = 1 ; i <= g2 ; i++)
{
if(sw[(of[i]-1+6)%6]=='1')
return 0;
}
return 1;
}
void dfs(int x,int k)
{
int i,j,ff =0;
char sj[110];
switch(x)
{
case 1:
for(i = 0 ; i < 6 ; i++)
if(str[i]=='0')
str[i] = '1';
else
str[i] = '0';break;
case 2:
for(i = 0 ; i < 6 ; i++)
{
if((i+1)%2!=0)
{
if(str[i]=='0')
str[i] = '1';
else
str[i] = '0';
}
}
break;
case 3:
for(i = 0 ; i < 6 ; i++)
{
if((i+1)%2==0)
{
if(str[i]=='0')
str[i] = '1';
else
str[i] = '0';
}
}
break;
case 4:
for(i = 0 ; i < 6 ; i++)
{
if(((i+1)-1)%3==0)
{
if(str[i]=='0')
str[i] = '1';
else
str[i] = '0';
}
}
break;
}
if(k==c)
{
for(i = 0 ; i < w ; i++)
{
if(strcmp(str,si[i])==0)
return ;
}
if(!judge(str))
return ;
strcpy(si[w],str);
w++;
return ;
}
for(j = 0 ; j < 6 ;j++)
sj[j] = str[j];
for(i = 1; i <= 4 ; i++)
{
for(j = 0 ; j < 6 ;j++)
str[j] = sj[j];
f[i] =1 ;
dfs(i,k+1);
}
}
int main()
{
freopen("lamps.in","r",stdin);
freopen("lamps.out","w",stdout);
int i,j,k,x;
cin>>n>>c;
while(cin>>x)
{
if(x==-1)
break;
g1++;
on[g1] = x;
}
while(cin>>x)
{
if(x==-1)
break;
g2++;
of[g2] = x;
}
for(i = 0 ; i < n ; i++)
ss[i] = '1';
if(c==0)
{
if(judge(ss))
puts(ss);
else
puts("IMPOSSIBLE");
return 0;
}
if(c>4)
c = 4;
for(i = 1; i <= 4 ; i++)
{
for(j = 0 ; j < 6 ;j++)
str[j] = ss[j];
dfs(i,1);
}
if(w==0)
{
puts("IMPOSSIBLE");
return 0;
}
qsort(si,w,sizeof(si[0]),Comp);
for(i = 0 ; i < w ; i++)
{
for(j = 1 ; j <= n/6 ; j++)
cout<<si[i];
for(j = 1 ; j <= n%6 ; j++)
cout<<si[i][j-1];
puts("");
}
fclose(stdin);
fclose(stdout);
return 0;
}