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 }
posted @ 2012-11-01 11:52  Naix_x  阅读(239)  评论(0编辑  收藏  举报