bzoj1019: [SHOI2008]汉诺塔

dp.

用g[x][i]代表第x根柱子的i个原盘会到哪个柱子,f[x][i]代表所用步数。

则根据g[x][i-1]和g[g[x][i-1]][i-1]就能知道搬运的过程是怎样的。

 

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;

char p[7][3];
int g[40][3],n;
long long f[40][3];

int main() {
    scanf("%d",&n);
    for(int i=1;i<=6;i++) scanf("%s",p[i]);
    
    for(int i=1;i<=3;i++)
    for(int j=1;j<=6;j++) if(p[j][0]-'A'+1==i) {
        f[i][1]=1;        
        g[i][1]=p[j][1]-'A'+1;
        break;
    }
    
    for(int i=2;i<=n;i++) 
    for(int x=1,y,z;x<=3;x++) {
        y=g[x][i-1];
        z=6-y-x;
        f[x][i]=f[x][i-1]+1;
        if(g[y][i-1]==z) {
            f[x][i]+=f[y][i-1];
            g[x][i]=z;    
        }
        else {
            f[x][i]+=f[y][i-1]+1+f[x][i-1];    
            g[x][i]=y;
        }
    }
    printf("%lld\n",f[1][n]);
    return 0;    
}
posted @ 2016-06-21 13:29  invoid  阅读(47)  评论(0编辑  收藏