【USACO2.2.4】Party Lamps派对灯

传送门

 

最近在写usaco的题。。

这个考虑到同种操作是可以抵消的,然后就从初状态开始枚举就好了。

 1 #include<cstdio>
 2 #include<algorithm>
 3 #define repu(i,x,y) for(i=x;i<=y;i++)
 4 #define min(a,b) (a<b?a:b)
 5 #define N 101
 6 struct state{
 7     int s[N];
 8 }a[20];
 9 int n,c,o[N],ol=0,f[N],fl=0,s[N],m=0;
10 int cmp(state a,state b) {
11     int i;
12     repu(i,1,n) {
13         if (a.s[i]<b.s[i]) return 1;
14         if (a.s[i]>b.s[i]) return 0;
15     }
16     return 2;
17 }
18 int judge() {
19     int i;
20     repu(i,1,ol)
21         if (!s[o[i]]) return 0;
22     repu(i,1,fl)
23         if (s[f[i]]) return 0;
24     return 1;
25 }
26 void dfs(int dep,int t) {
27     int i,j;
28     if (judge()) {
29         m++; repu(i,1,n) a[m].s[i]=s[i];
30     }
31     if (dep==min(c,4)) return;
32     repu(i,t+1,4) {
33         if (i==1) repu(j,1,n) s[j]=!s[j];
34         if (i==2) for (j=1;j<=n;j+=2) s[j]=!s[j];
35         if (i==3) for (j=2;j<=n;j+=2) s[j]=!s[j];
36         if (i==4) for (j=1;j<=n;j+=3) s[j]=!s[j];
37         dfs(dep+1,i);
38         if (i==1) repu(j,1,n) s[j]=!s[j];
39         if (i==2) for (j=1;j<=n;j+=2) s[j]=!s[j];
40         if (i==3) for (j=2;j<=n;j+=2) s[j]=!s[j];
41         if (i==4) for (j=1;j<=n;j+=3) s[j]=!s[j];
42     }
43 }
44 int main() {
45     int x,i,j;
46     scanf("%d%d",&n,&c);
47     repu(i,1,n) s[i]=1;
48     scanf("%d",&x);
49     while (x!=-1) {o[++ol]=x; scanf("%d",&x);}
50     scanf("%d",&x);
51     while (x!=-1) {f[++fl]=x; scanf("%d",&x);}
52     dfs(0,0);
53     if (!m) {
54         printf("IMPOSSIBLE");
55         return 0;
56     }
57     std::sort(a+1,a+m+1,cmp);
58     repu(i,1,m) 
59         if (cmp(a[i],a[i+1])!=2) {
60             repu(j,1,n)
61                 printf("%d",a[i].s[j]);
62             printf("\n");
63         }
64 }
View Code

 

posted @ 2017-06-02 13:26  lxtx  阅读(148)  评论(0)    收藏  举报