uva 10795 A Different Task
汉诺塔问题:
首先得记住一个经典的结论:把i个盘子移动到另外一个柱子上要花2^i-1步
然后这个题:
首先从底往上找到要移动的编号最大的盘子,把上面所有的移动在临时的柱子,然后把那个编号最大的移动到目标状态,
最后把前面移到临时柱子上的移到目标状态(循环递归);
利用前面的那个结论递归就可以了!
代码:
1 #include<cstdio> 2 #define maxn 66 3 #define ll long long 4 using namespace std; 5 6 ll f(int *p,int i,int final) 7 { 8 if(i==0)return 0; 9 if(p[i]==final)return f(p,i-1,final); 10 return f(p,i-1,6-p[i]-final)+(1ll<<i-1); 11 } 12 13 int n,s[maxn],l[maxn]; 14 15 int main() 16 { 17 int ca=1; 18 while(scanf("%d",&n)&&n) 19 { 20 for(int i=1;i<=n;i++)scanf("%d",&s[i]); 21 for(int i=1;i<=n;i++)scanf("%d",&l[i]); 22 int k=n; 23 while(k>=1&&s[k]==l[k])k--; 24 ll ans=0; 25 if(k>=1) 26 { 27 int ot=6-s[k]-l[k]; 28 ans=f(s,k-1,ot)+f(l,k-1,ot)+1; 29 } 30 printf("Case %d: %lld\n",ca++,ans); 31 } 32 return 0; 33 }