HDU 2511二分+汉诺塔
问题描述:求n阶汉诺塔第x步移动策略
开始的时候以为是汉诺塔的递归模拟,然后果断超时了。由于汉诺塔步骤1和步骤3的操作数相同,所以这里用二分查找来加速。
n阶汉诺塔需要移动2^n-1次,所以mid=(2^n-1+1)/2=2^n-1,
当step>mid时,step-=mid,转化成n-1阶汉诺塔。
#include<stdio.h> long long step,f[64]; void bsHanoi(int n,int a,int b,int c) { long long mid=f[n-1]; if(step==mid) { printf("%d %d %d\n",n,a,c); return ; } if(step<mid) bsHanoi(n-1,a,c,b); else { step-=mid; bsHanoi(n-1,b,a,c); } } int main() { int i,t; for(i=1,f[0]=1;i<64;i++) f[i]=f[i-1]<<1; scanf("%d",&t); while(t--) { int n; scanf("%d%I64d",&n,&step); bsHanoi(n,1,2,3); } return 0; }
递归汉诺塔模版:
void hannoi (int n, char A, char B, char C) //A移动到C,借助B,
{ if (n == 1) { cout << "Move disk " << n << " from " << A << " to " << C << endl; } else { hannoi (n-1, A, C, B); cout << "Move disk " << n << " from " << A << " to " << C << endl; hannoi (n-1, B, A, C); } }