这道题不同人有不同说法,有人说这道题表面看起来像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     

 

 
posted on 2012-07-10 19:33  醉春雨  阅读(132)  评论(0)    收藏  举报