【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 }

浙公网安备 33010602011771号