随笔 - 40, 文章 - 0, 评论 - 19, 引用 - 0
数据加载中……

TJU 2749. Marbles in Three Baskets ( Mid Atlantic North America 2006)

由每个最末的状态(n,n,n)推得所有可行的状态,并记录被推得状态的来源和步长,类似筛法的方式,没有被扩展到的情况即无法到达的情况,标记其步长仍为0.
  1#include<stdio.h>
  2#include<string.h>
  3
  4struct Q{
  5 int flag;
  6 int a;
  7 int b;
  8 int c;
  9}
;
 10Q f[61][61][61];
 11
 12 int chang1(Q t);
 13 int chang2(Q t);
 14 int chang3(Q t);
 15 int chang4(Q t);
 16 int chang5(Q t);
 17 int chang6(Q t);
 18 
 19int chang1(Q t){
 20    Q ne;
 21    if(t.a%2 !=0 ) return 0 ;      
 22    ne.a = t.a /2;
 23    ne.b = t.b+ne.a;
 24    ne.c = t.c;
 25
 26    if(ne.a == ne.b && ne.b == ne.c) return 0 ;
 27    if(f[ne.a][ne.b][ne.c].flag != 0 && f[ne.a][ne.b][ne.c].flag<t.flag+1return 0 ; 
 28    f[ne.a][ne.b][ne.c].flag = t.flag+1
 29    f[ne.a][ne.b][ne.c].a=t.a;
 30    f[ne.a][ne.b][ne.c].b=t.b;
 31    f[ne.a][ne.b][ne.c].c=t.c;        ne.flag = t.flag+1;    
 32    return chang1(ne)+chang2(ne)+chang3(ne)+chang4(ne)+chang5(ne)+chang6(ne); 
 33}

 34int chang2(Q t){
 35    Q ne;
 36    if(t.a%2 !=0 ) return 0 ;
 37    ne.a = t.a /2;
 38    ne.c = t.c+ne.a;
 39    ne.b = t.b;
 40     
 41    if(ne.a == ne.b && ne.b == ne.c) return 0 ;
 42    if(f[ne.a][ne.b][ne.c].flag != 0 && f[ne.a][ne.b][ne.c].flag<t.flag+1return 0 ;        
 43    f[ne.a][ne.b][ne.c].flag = t.flag+1
 44    f[ne.a][ne.b][ne.c].a=t.a;
 45    f[ne.a][ne.b][ne.c].b=t.b;
 46    f[ne.a][ne.b][ne.c].c=t.c;      ne.flag = t.flag+1
 47    return chang1(ne)+chang2(ne)+chang3(ne)+chang4(ne)+chang5(ne)+chang6(ne); 
 48}

 49int chang3(Q t){
 50    Q ne;
 51    if(t.b%2 !=0 ) return 0 ;    
 52    ne.b = t.b /2;
 53    ne.a = t.a+ne.b;
 54    ne.c = t.c;
 55
 56    if(ne.a == ne.b && ne.b == ne.c) return 0 ;
 57    if(f[ne.a][ne.b][ne.c].flag != 0 && f[ne.a][ne.b][ne.c].flag<t.flag+1return 0 ; 
 58    f[ne.a][ne.b][ne.c].flag = t.flag+1
 59    f[ne.a][ne.b][ne.c].a=t.a;
 60    f[ne.a][ne.b][ne.c].b=t.b;
 61    f[ne.a][ne.b][ne.c].c=t.c;        ne.flag = t.flag+1;   
 62    return chang1(ne)+chang2(ne)+chang3(ne)+chang4(ne)+chang5(ne)+chang6(ne); 
 63}

 64int chang4(Q t){
 65    Q ne;
 66    if(t.b%2 !=0 ) return 0 ;    
 67    ne.b = t.b /2;
 68    ne.c = t.c+ne.b;
 69    ne.a = t.a;
 70  
 71    if(ne.a == ne.b && ne.b == ne.c) return 0 ;
 72    if(f[ne.a][ne.b][ne.c].flag != 0 && f[ne.a][ne.b][ne.c].flag<t.flag+1return 0 ;
 73    f[ne.a][ne.b][ne.c].flag = t.flag+1
 74    f[ne.a][ne.b][ne.c].a=t.a;
 75    f[ne.a][ne.b][ne.c].b=t.b;
 76    f[ne.a][ne.b][ne.c].c=t.c;      ne.flag = t.flag+1;   
 77    return chang1(ne)+chang2(ne)+chang3(ne)+chang4(ne)+chang5(ne)+chang6(ne); 
 78}

 79
 80int chang5(Q t){
 81    Q ne;
 82    if(t.c%2 !=0 ) return 0 ;    
 83    ne.c = t.c /2;
 84    ne.a = t.a+ne.c;
 85    ne.b = t.b;
 86     
 87    if(ne.a == ne.b && ne.b == ne.c) return 0 ;
 88    if(f[ne.a][ne.b][ne.c].flag != 0 && f[ne.a][ne.b][ne.c].flag<t.flag+1return 0 ;      
 89    f[ne.a][ne.b][ne.c].flag = t.flag+1
 90    f[ne.a][ne.b][ne.c].a=t.a;
 91    f[ne.a][ne.b][ne.c].b=t.b;
 92    f[ne.a][ne.b][ne.c].c=t.c;    ne.flag = t.flag+1
 93    return chang1(ne)+chang2(ne)+chang3(ne)+chang4(ne)+chang5(ne)+chang6(ne); 
 94}

 95int chang6(Q t){
 96    Q ne;
 97    if(t.c%2 !=0 ) return 0 ;    
 98    ne.c = t.c /2;
 99    ne.b = t.b+ne.c;
100    ne.a = t.a;
101    
102    if(ne.a == ne.b && ne.b == ne.c) return 0 ;
103    if(f[ne.a][ne.b][ne.c].flag != 0 && f[ne.a][ne.b][ne.c].flag<t.flag+1return 0 ;    
104    f[ne.a][ne.b][ne.c].flag = t.flag+1
105    f[ne.a][ne.b][ne.c].a=t.a;
106    f[ne.a][ne.b][ne.c].b=t.b;
107    f[ne.a][ne.b][ne.c].c=t.c;     ne.flag = t.flag+1;  
108    return chang1(ne)+chang2(ne)+chang3(ne)+chang4(ne)+chang5(ne)+chang6(ne); 
109}

110void init(){
111     Q temp ;
112     for(int i = 1 ; i <= 20 ; i++ ){
113             f[i][i][i].a = i;
114             f[i][i][i].b = i;
115             f[i][i][i].c = i;
116             f[i][i][i].flag = 0;
117             temp  = f[i][i][i];
118            if (i % 2 != 0 )continue
119             chang1(temp)+chang2(temp)+chang3(temp)+chang4(temp)+chang5(temp)+chang6(temp);
120     }

121}

122int main(){
123    init();
124    Q f2;  
125    while(scanf("%d%d%d",&f2.a,&f2.b,&f2.c)!=EOF){
126     printf("%4d%4d%4d\n",f2.a,f2.b,f2.c);
127     while(f[f2.a][f2.b][f2.c].flag){
128     printf("%4d%4d%4d\n",f[f2.a][f2.b][f2.c].a,f[f2.a][f2.b][f2.c].b,f[f2.a][f2.b][f2.c].c);
129            f2 = f[f2.a][f2.b][f2.c];
130    }
       
131    printf("============\n");
132    }

133return 0 ;
134}

135

posted on 2008-10-09 23:41 hadn't 阅读(192) 评论(0)  编辑 收藏 引用


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