poj1958——Strange Towers of Hanoi

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座塔的最小步数。

代码:

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 #define il inline
 4 #define debug printf("%d %s\n",__LINE__,__FUNCTION__)
 5 using namespace std;
 6 int d[20],f[20];
 7 int main()
 8 {
 9     for(int i=1;i<=12;i++)d[i]=d[i-1]*2+1;
10     memset(f,0x3f,sizeof(f));
11     for(int i=1;i<=12;i++){
12         if(i==1)f[1]=1;
13         else for(int j=1;j<i;j++)f[i]=min(f[j]*2+d[i-j],f[i]);
14         printf("%d\n",f[i]);
15     }
16     return 0;
17 }

原文地址:https://www.cnblogs.com/five20/p/8514682.html

时间: 2024-10-12 14:04:58

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

POJ1958 Strange Towers of Hanoi --- 递推【n盘m塔Hanoi塔问题】

POJ1958 Strange Towers of Hanoi Sol: n盘4塔问题可以分为3步: 1.以4塔模式移走i个盘. 2.以3塔模式将剩余n-i个盘移至第4塔. 3.以4塔模式将第一步中的i个盘移至第4塔. 我们用\(d[i]\)表示在3塔模式下移i个盘的最小步数,\(f[i]\)表示在4塔模式下移i个盘的最小步数. 递推式:\(f[i]=\min_{1\leq j < i}(2*f[j]+d[i-j])\) EX 本题可以拓展至n盘m塔问题. \(f[i][j]\)表示在i塔模式下

[POJ1958]Strange Towers of Hanoi (递推)

POJ炸了 所以放这里来 #include<cstdio> #include<cmath> #include<cstring> #include<string> #include<map> #include<queue> #include<vector> #include<stack> #include<algorithm> #include<iostream> #define max(

[POJ1958]Strange Towers of Hanoi

分析 汉诺四塔 设 \(f[i]\) 表示求解 \(i\) 盘四塔的最少步数,设 \(d[i]\) 表示求解 \(i\) 盘三塔的最少步数: \[ d[i]=2\cdot d[i-1]+1\f[i]=\min_{j=1}^{i-1}\left\{2\cdot f[j]+d[i-j]\right\} \] 第二个递推式的含义是,将 \(j\) 盘在四塔模式下移动到一个中转柱,将剩余的 \(n-j\) 盘在三盘模式下移动到目标柱,再将那 \(j\) 个盘在四盘模式下移动到目标柱. 代码 #inclu

Strange Towers of Hanoi (POJ1958)

Strange Towers of Hanoi (POJ1958) n个盘子4座塔的Hanoi问题至少需要多少步?(1<=n<=12) 分析: n盘3塔: \(d[n] = 2*d[n-1]+1\) => \(d[n] = 2^n - 1\) 前n-1盘子 A -> B 第n盘子 A -> C 前n-1盘子 B -> C n盘4塔:\(f[n] = min_{1\leq i<n}\{2*f[i] + d[n-i]\}\) 把i个盘子 A->B (四塔模式)

POJ 1958 Strange Towers of Hanoi (线性dp,记忆化搜索)

JQuery工具方法. (1)$.isNumeric(obj) 此方法判断传入的对象是否是一个数字或者可以转换为数字. isNumeric: function( obj ) { // parseFloat NaNs numeric-cast false positives (null|true|false|"") // ...but misinterprets leading-number strings, particularly hex literals ("0x...&

poj 1958 Strange Towers of Hanoi

Strange Towers of Hanoi Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 2678   Accepted: 1742 Description Background Charlie Darkbrown sits in another one of those boring Computer Science lessons: At the moment the teacher just explains

POJ 1958 Strange Towers of Hanoi (四塔问题,线性dp,记忆化搜索)

题目分析:四柱汉诺塔.由于题目已经给出了求解方法,直接写代码即可.下面总结一下,四塔问题. 感谢这篇文章的作者,点这里就到,总结的很好.直接贴过来~ 四塔问题:设有A,B,C,D四个柱子(有时称塔),在A柱上有由小到大堆放的n个盘子. 今将A柱上的盘子移动到D柱上去.可以利用B,C柱作为工作栈用,移动的规则如下: ①每次只能移动一个盘子. ②在移动的过程中,小盘子只能放到大盘子的上面. 设计并实现一个求解四塔问题的动态规划算法,并分析时间和空间复杂性. 算法思想: 用如下算法移动盘子(记为Fou

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]\)为4塔转移步骤. \(f[i]=min(f[i],f[k]*2+d[i-k])\) 即先以4塔以上面的\(k\),再以3塔移\(i-k\),最后以4塔移动回去. 可以推广到\(n\)盘\(m\)塔 2018.5.26 原文地址:https://www.cnblogs.com/ppprseter

Strange Towers of Hanoi

题目链接:http://sfxb.openjudge.cn/dongtaiguihua/E/ 题目描述:4个柱子的汉诺塔,求盘子个数n从1到12时,从A移到D所需的最大次数.限制条件和三个柱子的汉诺塔问题相同. 解题思路:采用动态规划算法的思路为先从将k个盘子使用4个柱子的方法从A移到B,然后将A上剩下的n-k个盘子使用3个柱子的方法移到D上,然后再使用4个柱子的方法将B上的k个盘子移到D上.可以明白这道题会产生很多重复子问题.所以先计算出使用3个柱子的方法从A移到B的次数用数组f3保存.然后计