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. day 9 追踪一个蓝色的物体

    # -*- coding: utf- -*- import cv2 import numpy as np #.打开摄像头 cap=cv2.VideoCapture('output.avi') ): # ...

  2. idea开启jquery提示及如何找到学习目标

    idea开启jquery提示 根据这些library就知道该学习哪些技术了

  3. dbtool一bug跟踪记

    注:这篇日志是好多年前,我还在从兴公司时写的.现在都从从兴公司离职很久了,从兴也没落了,可惜.看了一下,虽然出现了部分代码,但不至于泄漏什么机密,查bug过程的原理也有可以让新手借鉴的地方,就原文照搬 ...

  4. idea项目 run、debug变灰色的问题

    点击如图所示位置的下来三角按钮,然后选择Edit Configurations,或者点击菜单栏Run>Edit Configurations 2 在运行配置窗口,选择一条springboot的运 ...

  5. python Matplotlib数据可视化神器安装与基本应用

    Matplotlib Matplotlib 是一个非常强大的 Python 画图工具; 手中有很多数据, Matplotlib能帮你画出美丽的: 线图; 散点图; 等高线图; 条形图; 柱状图; 3D ...

  6. Egret入门(二)--windows下环境搭建

    准备材料 安装Node.js TypeScript编辑器 HTTP服务器(可选) Chorme(可选) Egret 安装Node.js 打开www.nodejs.org 下载安装(全部next,全默认 ...

  7. SQL Server临时表漫谈

    SQL Server是微软的关系型数据库,对于刚入门的我是一个非常友好的开发工具.可视化界面的安装与操作,非常适合刚入门的我. 其实大家要找这方面的资料,在网上一搜一大堆,这里我就不赘述那些了,基本都 ...

  8. CsvHelper文档-4映射

    CsvHelper文档-4映射 类映射 有时候你的类成员和csv的header不一定对应,有时候你的csv文件根本就没有header行,你需要特别制定一个成员的index,你不能依靠.net中默认的顺 ...

  9. jquery on函数和prop与attr区别

    一.jquery on()方法 1.语法 2.例子 $(document).ready(function(){ $("p").on("click",functi ...

  10. js-jQuery对象与dom对象相互转换(转载)

    核心提示:jquery选择器得到的jquery对象和标准的 javascript中的document.getElementById()取得的dom对象是两种不同的对象类型,一般情况下,如S(’#id’ ...