A Za, A Za, Fighting...

坚信:勤能补拙

PKU 1166 The Clocks

问题:
http://acm.pku.edu.cn/JudgeOnline/problem?id=1166

思路:
首先,观察题意,可以看出对于每一种Move,最多只需执行4次
一共存在9种不同的Move,因此可以尝试枚举出所有的可能,这样的复杂度是: 4^9

 1 #define CLK_NUM 9
 2 #define MV_NUM 9
 3 #define DIAL_NUM 4
 4 int clocks[CLK_NUM];
 5 int moves[MV_NUM][CLK_NUM] = {
 6     {110110000}, /* move: 1 */
 7     {111000000}, /* move: 2 */
 8     {011011000}, /* move: 3 */
 9     {100100100}, /* move: 4 */
10     {010111010}, /* move: 5 */
11     {001001001}, /* move: 6 */
12     {000110110}, /* move: 7 */
13     {000000111}, /* move: 8 */
14     {000011011}  /* move: 9 */
15 };
16 int mv_cur[MV_NUM*4]; /* 4 times a circle for each move */
17 int mv_cur_num;
18 int flag;
19 
20 int 
21 is_ok()
22 {
23     int i;
24     for(i=0; i<CLK_NUM; i++)
25         if(clocks[i] % DIAL_NUM != 0)
26             return 0;
27     return 1;
28 }
29 
30 void
31 dfs(int depth)
32 {
33     if(depth > MV_NUM || flag)
34         return;
35     int i, j, k;
36     if(is_ok()) {
37         flag = 1;
38         for(i=0; i<mv_cur_num; i++)
39             printf("%d ", mv_cur[i]+1);
40         printf("\n");
41         return;
42     }
43     for(j=0; j<4; j++) { /* each move test 4 times */
44         for(k=0; k<j; k++) {
45             for(i=0; i<CLK_NUM; i++)
46                 clocks[i] += moves[depth][i];
47             mv_cur[mv_cur_num] = depth;
48             mv_cur_num += 1;
49         }
50         dfs(depth+1);
51         for(k=0; k<j; k++) {
52             for(i=0; i<CLK_NUM; i++)
53                 clocks[i] -= moves[depth][i];
54             mv_cur_num -= 1;
55         }
56     }
57 }

posted on 2010-07-05 09:55 simplyzhao 阅读(273) 评论(0)  编辑 收藏 引用 所属分类: B_搜索


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2011年9月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

统计

常用链接

留言簿(1)

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜