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); }