#P1958. Strange Towers of Hanoi

    ID: 959 传统题 1000ms 256MiB 尝试: 1 已通过: 1 难度: 10 上传者: 标签>动态规划汉诺塔TUD Programming Contest 2002DarmstadtGermany

Strange Towers of Hanoi

题目描述:

背景

查理・达克布朗又坐在一堂枯燥乏味的计算机科学课上:此刻,老师正在讲解经典的汉诺塔问题,这可把查理无聊得要命!

老师指着黑板(图 4)说道:“那么,问题是这样的:这里有三根塔柱:AABBCC。有 nn 个圆盘。在解这个谜题的过程中,nn 这个数量是固定不变的。所有圆盘的大小都不相同。初始时,这些圆盘都堆叠在塔柱 AA 上,并且从顶部到底部圆盘的大小是逐渐增大的。这个谜题的目标是把所有圆盘从塔柱 AA 转移到塔柱 CC。每次只能将一个圆盘从某根塔柱的顶部移动到另一根空的塔柱上,或者移动到另一根塔柱上顶部圆盘比它大的塔柱上。所以,你们的任务是编写一个程序,计算出将所有圆盘从塔柱 AA 移动到塔柱 CC 所需的最少移动次数。”查理说:“这太无聊了 —— 每个人都知道这可以用一个简单的递归来解决。我才拒绝编写这么简单的东西呢!”老师叹了口气:“好吧,查理,那我们来想想给你安排点别的事做:对你来说,这里有第四根塔柱 DD。计算出使用这四根塔柱,将所有圆盘从塔柱 AA 移动到塔柱 DD 所需的最少移动次数。”查理一脸困惑地看着:“呃…… 好吧,我不知道对于四根塔柱的情况有什么最优算法……”

问题

所以,真正的问题在于解决问题并不是查理所擅长的事情。实际上,查理唯一真正擅长的事情就是 “坐在一个能完成这项任务的人旁边”。现在猜猜看 —— 没错!坐在查理旁边的人就是你,而且他已经在盯着你了。幸运的是,你知道对于 n12n \leq 12 ,下面这个算法是可行的:首先,固定塔柱 AAk1k \geq 1 个圆盘,然后使用四根塔柱的算法将剩下的 nkn - k 个圆盘从塔柱 AA 移动到塔柱 BB。接着,使用三根塔柱的算法将塔柱 AA 上剩下的k个圆盘移动到塔柱 DD。最后,再次使用四根塔柱的算法将塔柱 BB 上的 nkn - k 个圆盘移动到塔柱 DD(这样就不会移动已经在塔柱 DD 上的 kk 个圆盘)。对所有 k{1,,n}k \in \{1, \ldots, n\} 都执行这个操作,然后找出移动次数最少的k值。所以,当 n=3n = 3 且 k=2k = 2 时,你首先要使用四根塔柱的算法将 11(323 - 2)个圆盘从塔柱 AA 移动到塔柱 BB(移动一次)。然后,使用三根塔柱的算法将塔柱 AA 上剩下的 22 个圆盘移动到塔柱 DD(移动三次)。最后一步是再次使用四根塔柱的算法将塔柱 BB 上的圆盘移动到塔柱 DD(再移动一次)。因此,对于 n=3n = 3 且 k=2k = 2 的情况,总共需要移动 55 次。为了确定这对于 n=3n = 3 来说确实是最佳解决方案,你需要检查 kk 的其他可能值 11 和 33 。(不过,顺便说一下,55次确实是最优的……)

输入:

没有输入

输出:

对于每一个nn(1n121 \leq n \leq 12),打印单独的一行,这一行包含使用四根塔柱解决 nn 个圆盘问题所需的最少移动次数。

输出数据1

没有输入

输出数据1

请参考输出内容。

来源:

2002 年达姆施塔特工业大学编程竞赛,德国达姆施塔特