poj1958——Strange Towers of Hanoi
- 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
Output
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的更多相关文章
- POJ-1958 Strange Towers of Hanoi(线性动规)
Strange Towers of Hanoi Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 2677 Accepted: 17 ...
- POJ1958 Strange Towers of Hanoi [递推]
题目传送门 Strange Towers of Hanoi Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 3117 Ac ...
- poj1958 strange towers of hanoi
说是递推,其实也算是个DP吧. 就是4塔的汉诺塔问题. 考虑三塔:先从a挪n-1个到b,把最大的挪到c,然后再把n-1个从b挪到c,所以是 f[i] = 2 * f[i-1] + 1; 那么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 ...
- POJ 1958 Strange Towers of Hanoi
Strange Towers of Hanoi Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 3784 Accepted: 23 ...
- POJ1958:Strange Towers of Hanoi
我对状态空间的理解:https://www.cnblogs.com/AKMer/p/9622590.html 题目传送门:http://poj.org/problem?id=1958 题目要我们求四柱 ...
- [POJ1958][Strange Tower of Hanoi]
题目描述 求解 \(n\) 个盘子 \(4\) 座塔的 Hanoi 问题最少需要多少步 问题分析 考虑 \(3\) 座塔的 Hanoi 问题,记 \(f[i]\) 表示最少需要多少步, 则 \(f[i ...
- Strange Towers of Hanoi
题目链接:http://sfxb.openjudge.cn/dongtaiguihua/E/ 题目描述:4个柱子的汉诺塔,求盘子个数n从1到12时,从A移到D所需的最大次数.限制条件和三个柱子的汉诺塔 ...
- Strange Towers of Hanoi POJ - 1958(递推)
题意:就是让你求出4个塔的汉诺塔的最小移动步数,(1 <= n <= 12) 那么我们知道3个塔的汉诺塔问题的解为:d[n] = 2*d[n-1] + 1 ,可以解释为把n-1个圆盘移动到 ...
随机推荐
- [转]关于PreparedStatement.addBatch()方法
Statement和PreparedStatement的区别就不多废话了,直接说PreparedStatement最重要的addbatch()结构的使用. 1.建立链接,(打电话拨号 ) Connec ...
- javaweb(三十一)——国际化(i18n)
一.国际化开发概述 软件的国际化:软件开发时,要使它能同时应对世界不同地区和国家的访问,并针对不同地区和国家的访问,提供相应的.符合来访者阅读习惯的页面或数据. 国际化(internationaliz ...
- 视觉SLAM中的深度估计问题
一.研究背景 视觉SLAM需要获取世界坐标系中点的深度. 世界坐标系到像素坐标系的转换为(深度即Z): 深度的获取一共分两种方式: a)主动式 RGB-D相机按照原理又分为结构光测距.ToF相机 To ...
- Maven私库
<server> <id>releases</id> <username>admin</username> <password> ...
- 001----Mysql隔离级别
一:事务隔离级别 mysql数据库的隔离界别如下: 1, READ UNCOMMITTED(未提交读) 事务中的修改,即使没有提交,对其它事务也是可见的. 这样会造成脏读(Dirty Read)的问 ...
- AsciiPic Java视频转成字符画
AsciiPic Java视频转成字符画 github下载 https://github.com/dejavudwh/AsciiPic 运行截图 //没有做GUI 比较简陋 节省时间 main里的文件 ...
- webpack整体配置结构
摘自<深入浅出webpack>2.8 const path = require('path'); module.exports = { // entry 表示入口,webpack执行的第一 ...
- 3星|李开复《AI·未来》:中国创业公司有独特优势,人工智能可能会加剧社会的不平等与不稳定
主要内容:作者对自己一些经历的回顾,对中美两国人工智能行业的回顾与展望. 作者认为中国的创业公司比美国节奏更快工作更拼命,深圳在硬件创新上远远领先于美国,中国创业公司们走出了一条跟美国不同的路. 作者 ...
- win7下配置spark
1.安装jdk(配置JAVA_HOME,CLASSPATH,path) 2.安装scala(配置SCALA_HOME,path) 3.安装spark Spark的安装非常简单,直接去Download ...
- leetcode个人题解——#43 Multiply Strings
思路:高精度乘法就可以了. 有两个错误以前没在意,1.成员属性定义时候不能进行初始化, vector<); 这样隐性调用了函数进行初始化的形式特别要注意,也是错误的: 2.容器类只有分配了空间时 ...