| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
不用DFS,直接二进制枚举就可以!附代码#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
#include <iostream>
#include <algorithm>
#define N 2000
using namespace std;
int son,soff,cnt,n,c,off[N],on[N];
string str[N];
bool lig[N],ans[N][N];
void read()
{
son=0; soff=0; cnt=0;
int a;
for(int i=1;i<=N-10;i++) str[i].clear();
while(scanf("%d",&a),~a) on[++son]=a;
while(scanf("%d",&a),~a) off[++soff]=a;
}
int getjo(int zt)
{
int rt=0;
for(int i=0;i<4;i++)
if((1<<i)&zt) rt++;
return rt;
}
void prt(int x)
{
cout<<x<<endl;
for(int i=1;i<=n;i++) printf("%d",lig[i]);
printf("\n");
}
void go()
{
for(int i=0;i<(1<<4);i++)
{
bool fg=true;
memset(lig,1,sizeof lig);
if((1<<0)&i)
for(int j=1;j<=n;j++) lig[j]=!lig[j];//全部翻转
if((1<<1)&i)
for(int j=1;j<=n;j+=2) lig[j]=!lig[j];//奇数灯翻转
if((1<<2)&i)
for(int j=2;j<=n;j+=2) lig[j]=!lig[j];//偶数灯翻转
if((1<<3)&i)
for(int j=1;j<=n;j+=3) lig[j]=!lig[j];//3n+1翻转
for(int j=1;j<=son;j++)
if(lig[on[j]]==false)
{fg=false;break;}
if(!fg) continue;
for(int j=1;j<=soff;j++)
if(lig[off[j]]==true)
{fg=false;break;}
if(!fg) continue;
if(getjo(i)<=c&&((getjo(i)&1)==(c&1)))
{
cnt++;
for(int j=1;j<=n;j++) ans[cnt][j]=lig[j];
}
}
for(int i=1;i<=cnt;i++)
{
for(int j=1;j<=n;j++)
str[i].push_back(ans[i][j]+'0');
}
sort(str+1,str+1+cnt);
for(int i=1;i<=cnt;i++) cout<<str[i]<<endl;
}
int main()
{
while(scanf("%d%d",&n,&c)!=EOF)
{
read();
go();
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator