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