jzoj 3948 Hanoi 塔

input  一行两个整数n,k。

output 一行一个整数,表示达到相同状态时小W 需要的移动次数。

30%的数据,n<=10。
100%的数据,1<=n<20,0<=k<2^n。

SOL:我们发现N不大,对于标准做法我们暴力模拟。对于w的做法我们发现一次solve_w(N)的代价是3^N-1,

那么我们每次可以用数学方法计算。

#include<bits/stdc++.h>
using namespace std;
int f[29],k,n;
long long p[29],ans;
void sol(int nn,int fo,int wl,int sp) {
    if (nn>0) {
        sol(nn-1,fo,sp,wl);
        if (!k) return;
        f[nn]=wl; k--;
        sol(nn-1,sp,wl,fo);
    }
}
void Sol(int nn,int fo,int wl,int sp) {
    if (nn>0) {
        if (fo==f[nn]) {
            Sol(nn-1,fo,wl,sp); return;
        }
        if (sp==f[nn]) {
            ans+=p[nn-1]+1;
            Sol(nn-1,wl,fo,sp);
            return;
        }
        ans+=p[nn-1]+1<<1;
        Sol(nn-1,fo,wl,sp);
    }
}
signed main () {
    scanf("%d%d",&n,&k);
//    k=1<<20;
    sol(n,0,1,2);
//    p[0]=1;
    for (int i=1;i<=n;i++) p[i]=p[i-1]*3+2;
    Sol(n,0,1,2);
//    for (int i=1;i<=n;i++) {
//        if (f[i]==now[i]) continue;
//        if (f[i]==0&&now[i]==1) {
//            
//        }
//    }
    printf("%lld\n",ans);
}

猜你喜欢

转载自www.cnblogs.com/rrsb/p/9299140.html