汉诺塔问题探讨
原题目
有三根柱子,每根柱子上一开始都是空的。我们把这三个柱子编号为1, 2, 3,现在,第一根柱子上有 N 个盘子按照尺寸从小到大排列,我们的目的是把这些盘子按顺序从第一根柱子转移到第三根上。在移动过程中有要求,即每个柱子上要想往上叠加盘子,只能叠加比它尺寸小的盘子。那么我们该怎么挪?
Link 提交评测区(codevs)
思路
我们先想这样一个思路,就是我们先定义一个函数
这里大家注意一下,一开始
现在我们完成了把一个最大的挪到
C
上的任务了,那么我们最终的任务就明了了,就是把每次的最大的挪到
伪代码
S1:利用Kansu(A, N - 1, B)将A上的N - 1个盘子按照顺序移动到B柱子上
S2:利用Move(A, C)将A柱子上剩下的一个最大的盘子移动到C柱子上
S3:利用Kansu(B, N - 2, A)将B上的N - 2个盘子按照顺序移动到B柱子上
......
最后在一个一个Move的过程中,C上就按照从大到小的顺序垒好了N个盘子。
C++代码
#include <cmath>
#include <iostream>
void Hanoi(const int n, const int A, const int B, const int C)
{
if (n > 0)
{
Hanoi(n - 1, A, C, B);
std::cout << n << " from " << char (64 + t.x) << " to " << char (64 + t.y) << '\n';
Hanoi(n - 1, C, A, B);
}
}
int main(int argc, char ** argv)
{
int n;
std::cin >> n;
std::cout << std::pow(2, n) - 1 << std::endl;
// 2^n - 1 表示步数总数
Hanoi(n, 1, 3, 2);
return 0;
}