zoukankan      html  css  js  c++  java
  • 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
    ",f[1][n]);
    57     return 0;
    58 }
    59 
  • 相关阅读:
    顺序队列C/C++实现
    顺序队列C/C++实现
    顺序队列C/C++实现
    Java文件拷贝
    Java文件拷贝
    三大范式与BCNF
    基础知识
    编辑软件
    Linux基础知识集锦
    Linux基础知识集锦
  • 原文地址:https://www.cnblogs.com/xiw5/p/5656587.html
Copyright © 2011-2022 走看看