1.4.2 The Clocks

一题被大家都说简单的搜索题目,我竟然花了n天,写出一个超时的代码,悲剧啊!但现在我还不懂为什么我那个是错的,按想法上说我那个是对的吧。

http://sznoi.cn/oj/ShowProblem?problemid=u015 题目的链接给出,是一个dfs题目吧。

就按每个操作最多进行3次操作,因为4次会复原。然后9个枚举,搜索,最终得出答案。这题让我纠结很久,看我了我搜索的弱,要做多2道这类型才可以啊!

View Code
 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<math.h>
 4 #include<stdlib.h>
 5 #define INF     0x3f3f3f3f
 6 #define Maxin 10000
 7 int v[10000],vn,ansn=INF,ans[10000];
 8 int clock[10];
 9 char ch[10][10] = {"ABDE", "ABC", "BCEF", "ADG", "BDEFH", "CFI", "DEGH", "GHI", "EFHI"};
10 int deal(int x)
11 {
12     int k=0;
13   while(ch[x][k]>='A'&&ch[x][k]<='Z')
14   {
15       clock[ch[x][k]-'A']+=3;
16       clock[ch[x][k]-'A']%=12;
17       k++;
18   }
19   return 0;
20 }
21 
22 int cover(int x)
23 {
24     int k=0;
25   while(ch[x][k]>='A'&&ch[x][k]<='Z')
26   {
27       clock[ch[x][k]-'A']-=3;
28       if(clock[ch[x][k]-'A']<0)
29           clock[ch[x][k]-'A']=9;
30       k++;
31   }
32   return 0;
33 }
34 
35 int good()
36 {
37     for(int x=0;x<9;x++)
38         if(clock[x]!=12&&clock[x]!=0)
39             return 0;
40     return 1;
41 }
42 
43 
44 int dfs(int x)
45 {
46     int z;
47     if(good()==1&&vn<ansn)//判断并且保存当前最佳答案
48     {
49       for(z=0;z<vn;z++)
50           ans[z]=v[z];
51       ansn=vn;
52       return 1;
53     }
54     if(x<0)
55         return 0;
56     for(int y=0;y<4;y++)
57     {
58      for(z=0;z<y;z++)//处理时钟
59      {
60          deal(x);
61          v[vn++]=x;
62      }
63      if(x>=0)
64          dfs(x-1);//进行下一种操作
65      for(z=0;z<y;z++)//恢复时钟
66      {
67          cover(x);
68          vn--;
69      }
70     }
71 
72     
73     return 0;
74 }
75 
76 int main()
77 {
78     int x;
79     vn=0;
80     for(x=0;x<9;x++)
81     {
82         scanf("%d",&clock[x]);
83       if(clock[x]==12)
84             clock[x]=0;
85     }
86     memset(v,0,sizeof(v));dfs(8);
87     dfs(8);
88     for(x=ansn-1;x>=0;x--)
89         printf("%d ",ans[x]+1);
90 //    printf("%d\n",ans);
91     return 0;
92 }

posted on 2012-05-14 13:13  usp10  阅读(188)  评论(1编辑  收藏  举报

导航