模拟这个过程,DFS
然后判断。
之后对于答案排序输出
用到一个小技巧:
对于长度相等的字符串,可以当做数字比大小使用sort
例如:在sort过程中,字符串“10001”是小于“10002”的
同样:字符串“aaaaaa”小于“aaaaab”;
/*
ID:xsy97051
LANG:C++
TASK:lamps
*/
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
string s[105];
bool off[105],on[105],ans[105],v[5];
int n,c,sum;
bool pai(string a,string b)
{
return a<b;
}
char zhuan(int x)
{
if(x) return '1';
return '0';
}
void pan()
{
int k=0;
for(int i=1;i<=n;++i)
{
if(on[i]&&!ans[i]) return;
if(off[i]&&ans[i]) return;
}
for(int i=1; i<=4; ++i) if(v[i]) k++;
if(c<k) return;
if((c-k)%2!=0) return;
for(int i=1; i<=n; ++i) s[sum]=s[sum]+zhuan(ans[i]);
sum++;
}
void dfs(int x)
{
if(x>4) { pan(); return;}
dfs(x+1);
if(x==1) for(int i=1; i<=n; i+=1) ans[i]=!ans[i];
if(x==2) for(int i=1; i<=n; i+=2) ans[i]=!ans[i];
if(x==3) for(int i=0; i<=n; i+=2) ans[i]=!ans[i];
if(x==4) for(int i=0; i<=n/3; i++) ans[i*3+1]=!ans[i*3+1];
v[x]=1;
dfs(x+1);
v[x]=0;
if(x==1) for(int i=1; i<=n; i+=1) ans[i]=!ans[i];
if(x==2) for(int i=1; i<=n; i+=2) ans[i]=!ans[i];
if(x==3) for(int i=0; i<=n; i+=2) ans[i]=!ans[i];
if(x==4) for(int i=0; i<=n/3; i++) ans[i*3+1]=!ans[i*3+1];
}
int main()
{
freopen("lamps.in","r",stdin);
freopen("lamps.out","w",stdout);
cin>>n>>c;
int k;
memset(v,0,sizeof(v));
memset(on,0,sizeof(on));
memset(ans,1,sizeof(ans));
memset(off,0,sizeof(off));
cin>>k;
while(k>0)
{
on[k]=1;
cin>>k;
}
cin>>k;
while(k>0)
{
off[k]=1;
cin>>k;
}
dfs(1);
sort(s,s+sum,pai);
for(int i=0;i<sum;++i)
cout<<s[i]<<endl;
if(sum==0)
cout<<"IMPOSSIBLE"<<endl;
return 0;
}