zoukankan      html  css  js  c++  java
  • Strange Towers of Hanoi POJ

    题意:就是让你求出4个塔的汉诺塔的最小移动步数,(1 <= n <= 12)

    那么我们知道3个塔的汉诺塔问题的解为:d[n] = 2*d[n-1] + 1 ,可以解释为把n-1个圆盘移动到一个临时柱子上,然后将1个最大圆盘移动到目标的主子,最后再将n-1个圆盘移动到目标柱子。

    为什么是n-1和1的组合呢,因为当你将n-i个圆盘移动到一个临时柱子上的时候,你会发现只靠两个柱子最多能移动1个圆盘。所以这个i=1

    如果推到到4个柱子的汉诺塔,f[n] = min(f[n],2*f[n-i]+d[i]). (1 <= i < n),就是把n-i个圆盘移动到临时的一个柱子上,然后把剩下的 i 个圆盘在三个柱子中移动到目标柱子,最后把n-i移动会目标柱子

     1 #include<iostream>
     2 #include<string.h>
     3 #include<cstdio>
     4 using namespace std;
     5 
     6 int d[20];
     7 int f[20];
     8 int main()
     9 {
    10     d[1] = 1;
    11     for(int i=2;i<=12;i++)d[i] = (d[i-1]<<1)+1;
    12     memset(f,0x3f,sizeof(f));
    13     f[1] = 1;
    14     for(int i=2;i<=12;i++)
    15     {
    16         for(int j=1;j<i;j++)
    17         {
    18             f[i] = min(f[i],(f[j]<<1)+d[i-j]);
    19         }
    20     }
    21     for(int i=1;i<=12;i++)
    22     {
    23         printf("%d
    ",f[i]);
    24     }
    25 }
    View Code
  • 相关阅读:
    多目标演化算法
    socket编程与线程模型二
    把DataGrid控件定制成漂亮的课程表
    socket编程与线程模型五
    socket编程与线程模型一
    关于RSS的点滴
    对.net事件的看法
    IIs上的证书安装要点
    2d游戏斜视角地图的实现
    Invoke and BeginInvoke
  • 原文地址:https://www.cnblogs.com/iwannabe/p/10099212.html
Copyright © 2011-2022 走看看