USACO 1.4 The Clocks(枚举)
过程是曲折的,代码是恶心的。无视把。。。和翻棋子游戏差不多,每种方式至多翻3次,然后在数据帮助下,终于A了。
1 /* 2 ID: cuizhe 3 LANG: C++ 4 TASK: clocks 5 */ 6 #include <cstdio> 7 #include <cstring> 8 #include <cmath> 9 using namespace std; 10 #define LL long long 11 LL ans; 12 int p[10][10],que[100],o[11]; 13 int judge() 14 { 15 int i,j; 16 for(i = 1;i <= 3;i ++) 17 { 18 for(j = 1;j <= 3;j ++) 19 { 20 if(p[i][j] != 0) 21 return 0; 22 } 23 } 24 return 1; 25 } 26 void dfs(int x) 27 { 28 int i,j,z; 29 int sum; 30 for(i = 1;i <= 3;i ++) 31 { 32 for(j = 1;j <= 3;j ++) 33 p[i][j] = p[i][j]%12; 34 } 35 if(judge()) 36 { 37 sum = 0; 38 for(i = 1;i <= 9;i ++) 39 sum += o[i]; 40 if(sum < ans) 41 { 42 sum = ans; 43 for(i = 1;i <= 9;i ++) 44 que[i] = o[i]; 45 } 46 else if(sum == ans) 47 { 48 for(i = 1;i <= 9;i ++) 49 { 50 if(o[i] > que[i]) 51 { 52 z = 1; 53 break; 54 } 55 } 56 if(z) 57 { 58 for(i = 1;i <= 9;i ++) 59 que[i] = o[i]; 60 } 61 } 62 return ; 63 } 64 if(x > 9) return; 65 for(i = 0;i <= 3;i ++) 66 { 67 if(x == 1) 68 { 69 p[1][1] += 3*i; 70 p[1][2] += 3*i; 71 p[2][1] += 3*i; 72 p[2][2] += 3*i; 73 o[x] = i; 74 dfs(x+1); 75 o[x] = 0; 76 p[1][1] -= 3*i; 77 p[1][2] -= 3*i; 78 p[2][1] -= 3*i; 79 p[2][2] -= 3*i; 80 } 81 else if(x == 2) 82 { 83 p[1][1] += 3*i; 84 p[1][2] += 3*i; 85 p[1][3] += 3*i; 86 o[x] = i; 87 dfs(x+1); 88 o[x] = 0; 89 p[1][1] -= 3*i; 90 p[1][2] -= 3*i; 91 p[1][3] -= 3*i; 92 } 93 else if(x == 3) 94 { 95 p[1][2] += 3*i; 96 p[1][3] += 3*i; 97 p[2][2] += 3*i; 98 p[2][3] += 3*i; 99 o[x] = i; 100 dfs(x+1); 101 o[x] = 0; 102 p[1][2] -= 3*i; 103 p[1][3] -= 3*i; 104 p[2][2] -= 3*i; 105 p[2][3] -= 3*i; 106 } 107 else if(x == 4) 108 { 109 p[1][1] += 3*i; 110 p[2][1] += 3*i; 111 p[3][1] += 3*i; 112 o[x] = i; 113 dfs(x+1); 114 o[x] = 0; 115 p[1][1] -= 3*i; 116 p[2][1] -= 3*i; 117 p[3][1] -= 3*i; 118 } 119 else if(x == 5) 120 { 121 p[1][2] += 3*i; 122 p[2][1] += 3*i; 123 p[2][2] += 3*i; 124 p[2][3] += 3*i; 125 p[3][2] += 3*i; 126 o[x] = i; 127 dfs(x+1); 128 o[x] = 0; 129 p[1][2] -= 3*i; 130 p[2][1] -= 3*i; 131 p[2][2] -= 3*i; 132 p[2][3] -= 3*i; 133 p[3][2] -= 3*i; 134 } 135 else if(x == 6) 136 { 137 p[1][3] += 3*i; 138 p[2][3] += 3*i; 139 p[3][3] += 3*i; 140 o[x] = i; 141 dfs(x+1); 142 o[x] = 0; 143 p[1][3] -= 3*i; 144 p[2][3] -= 3*i; 145 p[3][3] -= 3*i; 146 } 147 else if(x == 7) 148 { 149 p[2][1] += 3*i; 150 p[2][2] += 3*i; 151 p[3][1] += 3*i; 152 p[3][2] += 3*i; 153 o[x] = i; 154 dfs(x+1); 155 o[x] = 0; 156 p[2][1] -= 3*i; 157 p[2][2] -= 3*i; 158 p[3][1] -= 3*i; 159 p[3][2] -= 3*i; 160 } 161 else if(x == 8) 162 { 163 p[3][1] += 3*i; 164 p[3][2] += 3*i; 165 p[3][3] += 3*i; 166 o[x] = i; 167 dfs(x+1); 168 o[x] = 0; 169 p[3][1] -= 3*i; 170 p[3][2] -= 3*i; 171 p[3][3] -= 3*i; 172 } 173 else if(x == 9) 174 { 175 p[2][2] += 3*i; 176 p[2][3] += 3*i; 177 p[3][2] += 3*i; 178 p[3][3] += 3*i; 179 o[x] = i; 180 dfs(x+1); 181 o[x] = 0; 182 p[2][2] -= 3*i; 183 p[2][3] -= 3*i; 184 p[3][2] -= 3*i; 185 p[3][3] -= 3*i; 186 } 187 } 188 } 189 int main() 190 { 191 int i,j,z; 192 //freopen("clocks.in","r",stdin); 193 // freopen("clocks.out","w",stdout); 194 for(i = 1;i <= 3;i ++) 195 { 196 for(j = 1;j <= 3;j ++) 197 { 198 scanf("%d",&p[i][j]); 199 } 200 } 201 for(i = 1;i <= 9;i ++) 202 que[i] = 3; 203 ans = 27; 204 dfs(1); 205 z = 1; 206 for(i = 1;i <= 9;i ++) 207 { 208 if(que[i]) 209 { 210 for(j = 1;j <= que[i];j ++) 211 { 212 if(z) 213 { 214 printf("%d",i); 215 z = 0; 216 } 217 else 218 printf(" %d",i); 219 } 220 } 221 } 222 printf("\n"); 223 return 0; 224 }