题意:求有四根柱子的汉诺塔的最小移动次数。
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 }