zoukankan      html  css  js  c++  java
  • 杭电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 }
  • 相关阅读:
    Scanner类
    BufferedReader类
    打印类
    管道流
    内存操作流
    转换流——OutputStreamWriter类与InputStreamReader类
    Java字节流与字符流基本操作
    RandomAccessFile类
    File类
    Timer类和TimerTask类
  • 原文地址:https://www.cnblogs.com/ZShogg/p/2423241.html
Copyright © 2011-2022 走看看