Hanoi(汉诺)塔问题
古代有个梵塔,有A、B、C三个座,A塔有64个盘子,自上而下由小到大摆放,问将所有盘子移到C,摆放方式相同,且每次只能移动一个盘子,要求移动后的盘子依然保持自上而下由小到大摆放,问如何移动?
答:
假设 A(64)–>C(64) 需要S(64)步;
A(1)+B(63)–>C(64) 需要S(63)+1;
A(64)–> A(1)+B(63) 需要S(63);
递归数列为:
S(64)=2S(63)+1;
S(64)+1=2*[S(63)+1]
S(64)=2^63*[S(1)+1]-1
Code
#include <stdio.h>
//定义全局变量
int r=0;//计步
char x = 'A';//塔A
char y = 'B';//塔B
char z = 'C';//塔C
//Hanoi函数,移动盘子的步骤
int Hanoi(int n, char x, char y, char z)
{
if (n == 1) {
r=move(x,z);
}
else {
Hanoi(n - 1, x, z, y);
r=move(x, z);
Hanoi(n - 1, y, x, z);
}
}
//移动盘子的具体步骤输出
int move(char x, char y)
{
printf("%c-->%c\n", x, y);
r++;
}
// hanoi塔问题,输入盘子数,输出具体盘子的移动步骤
int main()
{
int n;
printf("需要移动的盘子数为:");
scanf_s("%d", &n);
r=Hanoi(n,x,y,z);
printf("需要移动%d步骤\n", r);
}