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 }

你可能感兴趣的:(USACO)