C语言——汉诺塔问题
2020-11-03 本文已影响0人
WhiteStruggle
汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
问题解析:
假设存在 N 层,首先需要经过一些换位操作将 第 N层 移倒到 C柱,然后是 N-1层,接着是 N-2层,以此类推,完成置换
hanio4.png经过一系列操作,得到
Hanio.png
移动 N层 到 C柱
hanio2.png接着是 N-1 层
hanio3.png· · · · · · · ·
hanio6.png完成置换:
hanio5.png 分析.png
移动第n层 需要先将 n-1层 移到 B ,然后将 n层 移到 C , 再把 n-1层 移到 C。
- 移动第n-1层 到 B , 需要先将 n-2层 移到 C ,然后将 n-1层 移到 B , 再把 n-2层 移到 B
- 移动第n-1层 到 C , 需要先将 n-2层 移到 B ,然后将 n-1层 移到 C , 再把 n-2层 移到 C
将问题简化为三个步骤:
- 将 n-1 移到 B
- 将 n 移到 C
- 将 n-1 移到 C
把 前n-1层
看成一个整体 为 M
, 最大层 为 n
,系统中就包含两层 : n
和 M
递推式 :
F(n) = 2F(n-1) + 1
证明:
F(1) = 1
F(2) = 2*1 + 1 = 3
F(3) = 2*3 + 1 = 7
F(4) = 2*7 + 1 = 15
·····
即 2^1-1 , 2^2-1 , 2^3-1 , 2^4-1 ······
因此可以推出:
F(n) = 2^n - 1
首先确定总层数,
- 如果层数是奇数,最上层由A--->C。
- 如果层数是偶数,最上层A--->B。
利用每递归一层交换B、C柱,由底层倒推到顶层,直到n==1
void hanoi(int n, char x, char y, char z)
{
if (n == 1)
{
move(x, 1, z);
}
else
{
hanoi(n - 1, x, z, y);
move(x, n, z);
hanoi(n - 1, y, x, z);
}
}
void move(char s, int n, char t)
{
printf("%d 从 %c 移动到 %c\n", n, s, t);
}