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 }