USACO 6.1.1 Postal Vans

题目大意:

求4*n的网格中哈密顿回路的条数。
 
简单题解:
基于连通性状态压缩的递推。
可以看我之前写的betsy的题解
本题由于一维只有4,所以可以手动计算所有状态与转移。
具体参见代码。
 
我的代码:
 1 /*
 2 ID:t-x.h1
 3 LANG:C++
 4 TASK:vans
 5 */
 6 #include<cstdio>
 7 #include<cstring>
 8 FILE *fi=fopen("vans.in","r"),*fo=fopen("vans.out","w");
 9 const int MAXn=1000+9,NF=6;
10 // ####
11 // (()) ()() ()## (##) ##() #()#
12 const bool link[NF][NF]=
13           {{1,0,1,0,1,0},
14            {0,1,0,1,0,0},
15            {0,1,0,1,0,0},
16            {1,0,1,0,1,1},
17            {0,1,0,1,0,0},
18            {0,0,0,1,0,0}};
19 struct bign
20 {
21         char n[500];
22         int l;
23         void set(int t)
24         {
25                 memset(n,0,sizeof(n));
26                 n[0]=t;
27                 l=1;
28         }
29         void operator += (const bign rhs)
30         {
31                 if(rhs.l>l)
32                         l=rhs.l;
33                 for(int i=0;i<l;++i)
34                 {
35                         n[i]+=rhs.n[i];
36                         if(n[i]>9)
37                                 ++n[i+1],n[i]-=10;
38                 }
39                 if(n[l])
40                         ++l;
41         }
42 }f[2][NF];
43 int main()
44 {
45         int n,i,j,k;
46         fscanf(fi,"%d",&n);
47         bign ans;
48         ans.set(0);
49         if(n!=1)
50         {
51                 int old=1,now=0;
52                 f[0][2].set(1);
53                 f[0][3].set(1);
54                 for(i=1;i<n;++i)
55                 {
56                         old^=1,now^=1;
57                         for(j=0;j<NF;++j)
58                                 f[now][j].set(0);
59                         for(j=0;j<NF;++j)
60                                 for(k=0;k<NF;++k)
61                                         if(link[j][k])
62                                         f[now][k]+=f[old][j];
63                 }
64                 ans+=f[now][2];
65                 ans+=f[now][4];
66         }
67         for(i=ans.l-1;i>=0;--i)
68                 fprintf(fo,"%d",ans.n[i]);
69         fputc(10,fo);
70         fclose(fi);
71         fclose(fo);
72         return 0;
73 }

 

posted @ 2012-08-18 13:04  凌云七风  阅读(162)  评论(0编辑  收藏  举报