USACO 2.2 Party Lamps(乱搞)
操作次数很多,灯泡也比较多,但是灯泡其实只有4个集合,4种操作,操作2次等于没有改变,所以枚举就行了,最后输出字典序搓了,写了个冒泡。。。
1 /* 2 ID: cuizhe 3 LANG: C++ 4 TASK: lamps 5 */ 6 #include <cstdio> 7 #include <cstring> 8 #include <cmath> 9 #include <algorithm> 10 using namespace std; 11 int aim[201],o[201],n,p[1001][201]; 12 int judge() 13 { 14 int i; 15 for(i = 1;i <= n;i ++) 16 { 17 if(aim[i] != -1) 18 { 19 if(o[i] != aim[i]) 20 return 0; 21 } 22 } 23 return 1; 24 } 25 int cmp(int x,int y) 26 { 27 int i; 28 for(i = 1;i <= n;i ++) 29 { 30 if(p[x][i] > p[y][i]) 31 return 1; 32 else if(p[y][i] > p[x][i]) 33 return 0; 34 } 35 return 0; 36 } 37 void swap(int x,int y) 38 { 39 int key[201],i; 40 for(i = 1;i <= n;i ++) 41 key[i] = p[x][i]; 42 for(i = 1;i <= n;i ++) 43 p[x][i] = p[y][i]; 44 for(i = 1;i <= n;i ++) 45 p[y][i] = key[i]; 46 } 47 int main() 48 { 49 int i,j,c,on,off,num,z,temp; 50 freopen("lamps.in","r",stdin); 51 freopen("lamps.out","w",stdout); 52 memset(aim,-1,sizeof(aim)); 53 scanf("%d%d",&n,&c); 54 z = 1; 55 temp = 1; 56 for(;;) 57 { 58 scanf("%d",&on); 59 if(on == -1) break; 60 aim[on] = 1; 61 } 62 for(;;) 63 { 64 scanf("%d",&off); 65 if(off == -1) break; 66 aim[off] = 0; 67 } 68 for(i = 0;i < (1<<4);i ++) 69 { 70 num = 0; 71 for(j = 1;j <= n;j ++) 72 o[j] = 1; 73 if(i&1) 74 { 75 memset(o,0,sizeof(o)); 76 num ++; 77 } 78 if(i&2) 79 { 80 for(j = 1;j <= n;j ++) 81 { 82 if(j%2) 83 o[j] = (o[j]+1)%2; 84 } 85 num ++; 86 } 87 if(i&4) 88 { 89 for(j = 1;j <= n;j ++) 90 { 91 if(j%2 == 0) 92 o[j] = (o[j]+1)%2; 93 } 94 num ++; 95 } 96 if(i&8) 97 { 98 for(j = 1;j <= n;j ++) 99 { 100 if(j%3 == 1) 101 o[j] = (o[j]+1)%2; 102 } 103 num ++; 104 } 105 if(c >= num&&(c-num)%2 == 0) 106 { 107 if(judge()) 108 { 109 z = 0; 110 for(j = 1;j <= n;j ++) 111 p[temp][j] = o[j]; 112 temp ++; 113 } 114 } 115 } 116 temp --; 117 for(i = 1;i <= temp-1;i ++) 118 { 119 for(j = 1;j <= temp-i;j ++) 120 { 121 if(cmp(j,j+1)) 122 { 123 swap(j,j+1); 124 } 125 } 126 } 127 for(i = 1;i <= temp;i ++) 128 { 129 for(j = 1;j <= n;j ++) 130 printf("%d",p[i][j]); 131 printf("\n"); 132 } 133 if(z) printf("IMPOSSIBLE\n"); 134 return 0; 135 }