您的位置:首页 > 其它

【BZOJ 1019】 1019: [SHOI2008]汉诺塔 (DP?)

2017-03-21 09:17 253 查看

1019: [SHOI2008]汉诺塔

Description

  汉诺塔由三根柱子(分别用A B C表示)和n个大小互不相同的空心盘子组成。一开始n个盘子都摞在柱子A上,
大的在下面,小的在上面,形成了一个塔状的锥形体。

1 #include<cstdio>
2 #include<cstdlib>
3 #include<cstring>
4 #include<iostream>
5 #include<algorithm>
6 using namespace std;
7 #define LL long long
8
9 int x[10],y[10];
10 char s[5];
11
12 LL f[5][40];
13 int p[5][40];
14
15 int main()
16 {
17     int n;
18     scanf("%d",&n);
19     for(int i=1;i<=6;i++)
20     {
21         scanf("%s",s);
22         x[i]=s[0]-'A'+1;y[i]=s[1]-'A'+1;
23     }
24     for(int i=6;i>=1;i--) p[x[i]][1]=y[i];
25     for(int i=1;i<=3;i++) f[i][1]=1;
26     for(int i=2;i<=n;i++)
27     {
28         for(int a=1;a<=3;a++)
29         {
30             int b=p[a][i-1],c=6-a-b;
31             if(p[b][i-1]==c)
32             {
33                 f[a][i]=f[a][i-1]+f[b][i-1]+1;
34                 p[a][i]=c;
35             }
36             else
37             {
38                 f[a][i]=f[a][i-1]+1+f[b][i-1]+1+f[a][i-1];
39                 p[a][i]=b;
40             }
41         }
42     }
43     printf("%lld\n",f[1]
);
44     return 0;
45 }


View Code

2017-03-21 09:17:45
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: