The teacher points to the blackboard (Fig. 4) and says: "So here is the problem:

  • There are three towers: A, B and C.
  • There are n disks. The number n is constant while working the puzzle.
  • All disks are different in size.
  • The disks are initially stacked on tower A increasing in size from the top to the bottom.
  • The goal of the puzzle is to transfer all of the disks from tower A to tower C.
  • One disk at a time can be moved from the top of a tower either to an empty tower or to a tower with a larger disk on the top.

So your task is to write a program that calculates the smallest
number of disk moves necessary to move all the disks from tower A to C."

Charlie: "This is incredibly boring—everybody knows that this can be
solved using a simple recursion.I deny to code something as simple as
this!"

The teacher sighs: "Well, Charlie, let's think about something for
you to do: For you there is a fourth tower D. Calculate the smallest
number of disk moves to move all the disks from tower A to tower D using
all four towers."

Charlie looks irritated: "Urgh. . . Well, I don't know an optimal algorithm for four towers. . . "

Problem

So the real problem is that problem solving does not belong to the
things Charlie is good at. Actually, the only thing Charlie is really
good at is "sitting next to someone who can do the job". And now guess
what — exactly! It is you who is sitting next to Charlie, and he is
already glaring at you.

Luckily, you know that the following algorithm works for n <= 12:
At first k >= 1 disks on tower A are fixed and the remaining n-k
disks are moved from tower A to tower B using the algorithm for four
towers.Then the remaining k disks from tower A are moved to tower D
using the algorithm for three towers. At last the n - k disks from tower
B are moved to tower D again using the algorithm for four towers (and
thereby not moving any of the k disks already on tower D). Do this for
all k 2 ∈{1, .... , n} and find the k with the minimal number of moves.

So for n = 3 and k = 2 you would first move 1 (3-2) disk from tower A
to tower B using the algorithm for four towers (one move). Then you
would move the remaining two disks from tower A to tower D using the
algorithm for three towers (three moves). And the last step would be to
move the disk from tower B to tower D using again the algorithm for four
towers (another move). Thus the solution for n = 3 and k = 2 is 5
moves. To be sure that this really is the best solution for n = 3 you
need to check the other possible values 1 and 3 for k. (But, by the way,
5 is optimal. . . )

Input

There is no input.

Output

For
each n (1 <= n <= 12) print a single line containing the minimum
number of moves to solve the problem for four towers and n disks.

Sample Input

No input.

Sample Output

REFER TO OUTPUT.

题意:

本题大意是求n个盘子四座塔的hanoi问题的最少步数。输出n为1~12个盘子时各自的答案。

Solution:

首先考虑n个盘子3座塔的最少步数。设d[n]表示n个盘子的最少步数,则易得递推方程:d[n]=d[n-1]*2+1,意思是把前n-1个盘子从A柱移到B柱,然后把第n个盘子移到C柱,最后把前n-1个盘子移到C柱。

那么回到本题,设f[n]表示n个盘子4座塔的最少步数。则易得递推方程:f[n]=min{2*f[i]+d[n-i]}(1<=i<n),其中f[1]=1。

上式意思是,先把i个盘子在4塔模式下移到B柱,然后把n-i个盘子在3塔模式下移到D柱,最后把i个盘子在4塔模式下移到D柱。考虑所有可能的i取最小值,就得到了上述式子。

由本题其实可以推及到n个盘子m座塔的最小步数。

代码:

#include<bits/stdc++.h>
#define ll long long
#define il inline
#define debug printf("%d %s\n",__LINE__,__FUNCTION__)
using namespace std;
int d[],f[];
int main()
{
for(int i=;i<=;i++)d[i]=d[i-]*+;
memset(f,0x3f,sizeof(f));
for(int i=;i<=;i++){
if(i==)f[]=;
else for(int j=;j<i;j++)f[i]=min(f[j]*+d[i-j],f[i]);
printf("%d\n",f[i]);
}
return ;
}

poj1958——Strange Towers of Hanoi的更多相关文章

  1. POJ-1958 Strange Towers of Hanoi(线性动规)

    Strange Towers of Hanoi Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 2677 Accepted: 17 ...

  2. POJ1958 Strange Towers of Hanoi [递推]

    题目传送门 Strange Towers of Hanoi Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 3117   Ac ...

  3. poj1958 strange towers of hanoi

    说是递推,其实也算是个DP吧. 就是4塔的汉诺塔问题. 考虑三塔:先从a挪n-1个到b,把最大的挪到c,然后再把n-1个从b挪到c,所以是 f[i] = 2 * f[i-1] + 1; 那么4塔类似: ...

  4. POJ 1958 Strange Towers of Hanoi 解题报告

    Strange Towers of Hanoi 大体意思是要求\(n\)盘4的的hanoi tower问题. 总所周知,\(n\)盘3塔有递推公式\(d[i]=dp[i-1]*2+1\) 令\(f[i ...

  5. POJ 1958 Strange Towers of Hanoi

    Strange Towers of Hanoi Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 3784 Accepted: 23 ...

  6. POJ1958:Strange Towers of Hanoi

    我对状态空间的理解:https://www.cnblogs.com/AKMer/p/9622590.html 题目传送门:http://poj.org/problem?id=1958 题目要我们求四柱 ...

  7. [POJ1958][Strange Tower of Hanoi]

    题目描述 求解 \(n\) 个盘子 \(4\) 座塔的 Hanoi 问题最少需要多少步 问题分析 考虑 \(3\) 座塔的 Hanoi 问题,记 \(f[i]\) 表示最少需要多少步, 则 \(f[i ...

  8. Strange Towers of Hanoi

    题目链接:http://sfxb.openjudge.cn/dongtaiguihua/E/ 题目描述:4个柱子的汉诺塔,求盘子个数n从1到12时,从A移到D所需的最大次数.限制条件和三个柱子的汉诺塔 ...

  9. Strange Towers of Hanoi POJ - 1958(递推)

    题意:就是让你求出4个塔的汉诺塔的最小移动步数,(1 <= n <= 12) 那么我们知道3个塔的汉诺塔问题的解为:d[n] = 2*d[n-1] + 1 ,可以解释为把n-1个圆盘移动到 ...

随机推荐

  1. 【LG4294】[WC2008]游览计划

    [LG4294][WC2008]游览计划 题面 洛谷 bzoj 题解 斯坦纳树板子题. 斯坦纳树的总结先留个坑. 代码 #include <iostream> #include <c ...

  2. 【HDU3117】Fibonacci Numbers

    [HDU3117]Fibonacci Numbers 题面 求斐波那契数列的第\(n\)项的前四位及后四位. 其中\(0\leq n<2^{32}\) 题解 前置知识:线性常系数齐次递推 其实后 ...

  3. 原生android(二)——认识activity

    一.activity的生命周期 1.onCreate():在活动第一次被创建的时候调用,用来完成活动的初始化操作,如加载布局.绑定事件等 2.onStart():在活动由不可见变为可见时被调用 3.o ...

  4. Qt-QML-电子罗盘

    使用QML中的Canvas实现电子罗盘绘制,效果图如下 一个简单的电子罗盘,红色N极.其中中间飞机表示当前的指向, 还是比较简单的,直接上代码吧 /* 作者:张建伟 时间:2018年4月27日 简述: ...

  5. 180730-Spring之RequestBody的使用姿势小结

    Spring之RequestBody的使用姿势小结 SpringMVC中处理请求参数有好几种不同的方式,如我们常见的下面几种 根据 HttpServletRequest 对象获取 根据 @PathVa ...

  6. 微信小程序和微信H5测试中易出Bug的点和注意事项

    一.微信小程序 易出Bug的点: 小程序的分享转发功能 背景:小程序项目开发基本完毕也都已经测过几轮,功能上基本没有什么问题,但是上线后却被客户发现通过分享转发小程序给别人,别人无法正常打开的情况 原 ...

  7. 安装文件报错error while loading shared libraries: libssl.so.6

    http://www.openssl.org/source/  这里下载http://www.openssl.org/source/openssl-1.0.0r.tar.gz 安装命令为:tar -z ...

  8. 扩展Lucas定理 扩展Lucas板子

    题意概述:多组询问,给出N,K,M,要求回答C(N,K)%M,1<=N<=10^18,1<=K<=N,2<=M<=10^6 分析: 模数不为质数只能用扩展Lucas ...

  9. POJ 3258(二分求最大化最小值)

    题目链接:http://poj.org/problem?id=3258 题目大意是求删除哪M块石头之后似的石头之间的最短距离最大. 这道题目感觉大致代码写起来不算困难,难点在于边界处理上.我思考边界思 ...

  10. 使用JSon实现三级联动

    JSon实现三级联动 我觉得我这个方法比较麻烦,但是目前技术还比较弱,所以先做个笔记自己理解.目前没有和后台交互,只是在前台页面实现了 jQuery和JSon数据实现的,代码如下: <!DOCT ...