- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想知道在 towers of Hanoi 中的给定移动中每个 Hook 上有多少个圆盘谜。例如,给定 n = 3
磁盘,我们有这个配置序列来优化解决这个难题:
0 1 2
0. 3 0 0
1. 2 0 1 (move 0 -> 2)
2. 1 1 1 (move 0 -> 1)
3. 1 2 0 (move 2 -> 1)
4. 0 2 1 (move 0 -> 2)
5. 1 1 1 (move 1 -> 0)
6. 1 0 2 (move 1 -> 2)
7. 0 0 3 (move 0 -> 2)
给定第 5 步,我想返回 1 1 1
,给定第 6 步,我想要 1 0 2
等
这可以通过使用经典算法并在一定数量的移动后停止它来轻松完成,但我想要更高效的东西。我上面链接的维基百科页面在 Binary solutions
部分给出了一个算法。然而我认为这是错误的。我也不明白他们是如何计算n
的。
如果您按照他们的示例并将其返回的磁盘位置转换为我想要的,它会为 n = 8
磁盘和移动编号 提供
。然而,使用经典算法,我得到 4 0 4
2164 2 2
。
还有一个用C语言实现的高效算法here这也给出了 4 2 2
作为答案,但它缺少文档而且我无法访问它所基于的论文。
上一个链接中的算法似乎是正确的,但谁能解释一下它究竟是如何工作的?
一些我也感兴趣的相关问题:
n
?最佳答案
1) 如果您的算法说 Wikipedia 已损坏,我猜您是对的...
2)至于计算每个 Hook 中的磁盘数量,对其进行递归算法是否非常简单:
(未经测试、不优雅且可能充满 +-1 错误的代码如下:)
function hanoi(n, nsteps, begin, middle, end, nb, nm, ne)
// n = number of disks to mive from begin to end
// nsteps = number of steps to move
// begin, middle, end = index of the pegs
// nb, nm, ne = number of disks currently in each of the pegs
if(nsteps = 0) return (begin, middle, end, nb, nm, ne)
//else:
//hanoi goes like
// a) h(n-1, begin, end, middle) | 2^(n-1) steps
// b) move 1 from begin -> end | 1 step
// c) h(n-1, middle, begin, end) | 2^(n-1) steps
// Since we know how the pile will look like after a), b) and c)
// we can skip those steps if nsteps is large...
if(nsteps <= 2^(n-1)){
return hanoi(n-1, nsteps, begin, end, middle, nb, ne, nm):
}
nb -= n;
nm += (n-1);
ne += 1;
nsteps -= (2^(n-1) + 1);
//we are now between b) and c)
return hanoi((n-1), nsteps, middle, begin, end, nm, nb, ne);
function(h, n, nsteps)
return hanoi(n, nsteps, 1, 2, 3, n, 0, 0)
如果你想要效率,它应该尝试将其转换为迭代形式(应该不难 - 你不需要维护堆栈)并找到一种更好地表示程序状态的方法,而不是随意使用 6 个以上的变量。
关于algorithm - 河内配置在一定的举动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5890017/
这是我正在做的作业。我创建了 2 个类来玩汉诺塔。第一个基本上是运行实际游戏类的运行者。 import java.util.Scanner; class TowersRunner { publ
我是一名优秀的程序员,十分优秀!