杭电1207

题意:求有四根柱子的汉诺塔的最小移动次数。

Analyse:
由移动最后一个盘子时的状态倒推:
设f[n]为n个盘子4根柱的移动数,g[n]为n个盘子3根柱的移动数,已知g[n]=2^n-1;
第一根柱子上只有最大的盘子,第三根柱子上没有盘子,剩下的盘子都一定在第二或四根上。设有n(n>4)个盘子要移动,先把1,2移到第二(四)根柱子上,3有两个地方可以放(一个选择是放在第二根柱子上,另一个选择是放在第四根柱子上)。假设3放在第四根柱子上,后面的盘子(除最后一个)都跟3一样放在第四根柱子上。若3放在第二根柱子上,4就有两种选择,一直下去,直到k+1要放到第四根柱子时,后面的盘子(除最后一个)都放在第四根柱子上。在k+1之前的盘子的移动跟后面的盘子放的位置无关,最少移动数为f[n]= min{2*f[k]+2*2*2^(n-1-k)+1}(1<=k<n)。
View Code
 1 #include<stdio.h>
2 #include<math.h>
3 main()
4 {
5 __int64 hanoi[66],min,temp;
6 int i,j;
7 hanoi[1]=1;
8 hanoi[2]=3;
9 for(i=3;i<=64;i++)
10 {
11 min=0xfffffff;
12 for(j=1;j<i;j++)
13 {
14 temp=2*hanoi[j]+pow(2,i-j)-1;
15 if(temp<min && temp>0)
16 min=temp;
17 }
18 hanoi[i]=min;
19 }
20 while(scanf("%d",&i)!=EOF)
21 printf("%I64d\n",hanoi[i]);
22 }

转载于:https://www.cnblogs.com/ZShogg/archive/2012/03/29/2423241.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值