思路:
现有起始串x、过渡串y和目标串z,盘子数量n
最大盘上面的所有盘记为 □
(如一共五个盘子,前四个小的盘子记为 □
步骤:
1. □ → 过渡串y (这样才能移动最大盘)
2. 最大盘 → 目标串z
3. □ → 目标串z
而步骤1如何实现呢?
其实步骤1又成为了一个新的问题:n-1层的汉诺塔如何操作,
但是还是继续上面的步骤来操作,直到为1层,就可以直接移动。这些分解出的小问题实现后,大问题自然就实现了(大问题由小问题组合而成)
只不过在这个过程中,起始串、过渡串、目标串的位置会改变,如:
最初的步骤1. □ → 过渡串y,此步骤的目标串z为大整体的过渡串y
代码(C语言)
#include <stdio.h>
int hanoi(int n, char x, char y, char z);
int move(int n, char start, char end);
#include <stdio.h>
int main()
{
int n, counter;
printf("Input the number of diskes:");
scanf_s("%d", &n);
printf("\n");
counter = hanoi(n, 'A', 'B', 'C');
return 0;
}
int hanoi(int n, char x, char y, char z)
{
if (n == 1)
move(1, x, z);
else
{
hanoi(n - 1, x, z, y);
move(n, x, z);
hanoi(n - 1, y, x, z);
}
return 0;
}
int move(int n, char start, char end)
{
static int k = 1;
printf("步骤%d(盘子%d): %c->%c\n", k, n, start, end);
if (k++ % 3 == 0)
printf("\n");
return 0;
}
代码(python)
def hann(x, y, z, n):
if n == 1:
print("{}->{}".format(x,z))
else:
hann(x, z, y, n-1)
print("{}->{}".format(x,z))
hann(y, x, z, n-1)
n = eval(input("多少个圆盘:"))
hann("A", "B", "C", n)