这道题不同人有不同说法,有人说这道题表面看起来像BFS,其实用了才知道会MLE;但另外有人说这道题是典型的BFS题……本着既然有人能做出来的原则,还是用BFS做出来了,做出来才明白剪枝该有多重要……以后分析要尽可能彻底些。
下面贴出代码,以作纪念:
View Code
1 /*{ 2 ID:s42k5ek 3 PROG:clocks 4 LANG:C++ 5 }*/ 6 #include<stdio.h> 7 #include<iostream> 8 #include<string.h> 9 using namespace std; 10 11 int a[3][3]; 12 int b[3][3]; 13 int c[3][3]; 14 int d[30]; 15 typedef int l[3][3]; 16 struct ll 17 { 18 l m; 19 int n; 20 int v; 21 int u; 22 }; 23 bool judge(int c[][3]) 24 { 25 int i,j; 26 for(i=0;i<3;i++) 27 for(j=0;j<3;j++) 28 { 29 if(c[i][j]%4!=0) 30 return false; 31 } 32 return true; 33 } 34 ll mm[270000]; 35 int main() 36 { 37 38 freopen ("clocks.in","r",stdin); 39 freopen ("clocks.out","w",stdout); 40 int i,j,s=0,q=0,n=0,p; 41 for(i=0;i<3;i++) 42 for(j=0;j<3;j++) 43 scanf("%d",&a[i][j]); 44 for(i=0;i<3;i++) 45 for(j=0;j<3;j++) 46 { 47 switch(a[i][j]) 48 { 49 case 12:b[i][j]=0;break; 50 case 3:b[i][j]=-3;break; 51 case 6:b[i][j]=-2;break; 52 case 9:b[i][j]=-1;break; 53 } 54 } 55 p=judge(b); 56 ll k; 57 memcpy(mm[q].m,b,sizeof(b)); 58 mm[q].n=0; 59 mm[q].u=1; 60 q++; 61 while(p==0) 62 { 63 for(i=0;i<9;i++) 64 { 65 if(mm[n].n>i+1) 66 continue; 67 memcpy(c,mm[n].m,sizeof(b)); 68 switch(i) 69 { 70 case 0:c[0][0]++;c[0][1]++;c[1][0]++;c[1][1]++;break; 71 case 1:c[0][0]++;c[0][1]++;c[0][2]++;break; 72 case 2:c[0][1]++;c[0][2]++;c[1][1]++;c[1][2]++;break; 73 case 3:c[0][0]++;c[1][0]++;c[2][0]++;break; 74 case 4:c[0][1]++;c[1][0]++;c[1][1]++;c[1][2]++;c[2][1]++;break; 75 case 5:c[0][2]++;c[1][2]++;c[2][2]++;break; 76 case 6:c[1][0]++;c[1][1]++;c[2][0]++;c[2][1]++;break; 77 case 7:c[2][0]++;c[2][1]++;c[2][2]++;break; 78 case 8:c[1][1]++;c[1][2]++;c[2][1]++;c[2][2]++;break; 79 } 80 mm[q].v=n; 81 mm[q].n=i+1; 82 if(mm[q].n==mm[mm[q].v].n) 83 mm[q].u=mm[mm[q].v].u+1; 84 else 85 mm[q].u=1; 86 if(mm[q].u>=4) 87 continue; 88 p=judge(c); 89 if(p) 90 break; 91 memcpy(mm[q].m,c,sizeof(c)); 92 q++; 93 } 94 n++; 95 } 96 d[s]=mm[q].n; 97 s++; 98 k=mm[q]; 99 while(k.v!=0) 100 { 101 k=mm[k.v]; 102 d[s]=k.n; 103 s++; 104 } 105 for(i=s-1;i>=0;i--) 106 { 107 if(i!=0) 108 printf("%d ",d[i]); 109 else 110 printf("%d\n",d[i]); 111 } 112 return 0; 113 } 114 115 116 117 118 119 120 121

浙公网安备 33010602011771号