bzoj 1019: [SHOI2008]汉诺塔

f[i][j]表示i上有j个盘子移到g[i][j]上的步数

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<algorithm>
 6 #include<queue>
 7 #include<map>
 8 #include<cmath>
 9 #define M 202
10 #define ll long long
11 #define Mo 998244353
12 #define pa pair<int,int>
13 using namespace std;
14 ll read()
15 {
16     char ch=getchar();
17     ll x=0,f=1;
18     for(;ch<'0'||ch>'9';ch=getchar())
19       if(ch=='-')
20         f=-1;
21     for(;ch>='0'&&ch<='9';ch=getchar())
22       x=x*10+ch-'0';
23     return x*f;
24 }
25 int n,g[4][M],p[M];
26 ll f[4][M];
27 int main()
28 {
29     n=read();
30     for(int i=1;i<=6;i++)
31       {
32         char ch[10];
33         scanf("%s",ch);
34         int a1=ch[0]-'A'+1,a2=ch[1]-'A'+1;
35         if(p[a1])
36           continue;
37         p[a1]=1;
38         g[a1][1]=a2;
39         f[a1][1]=1;
40       }
41     for(int i=2;i<=n;i++)
42       for(int j=1;j<=3;j++)
43         {
44             int y=g[j][i-1],k=1+2+3-j-g[j][i-1];
45             if(g[y][i-1]==k)
46               {
47                 f[j][i]=f[j][i-1]+1+f[y][i-1];
48                 g[j][i]=k;
49               }
50             else
51               {
52                 g[j][i]=y;
53                 f[j][i]=f[j][i-1]+1+f[y][i-1]+1+f[j][i-1];
54               }
55         }
56     printf("%lld\n",f[1][n]);
57     return 0;
58 }
59 

 

posted @ 2016-07-09 20:36  xiw5  阅读(215)  评论(0编辑  收藏  举报