算法:
1, 从目标出发,我们将n个盘子从A移动到B通过C,假如我们这样写
hanoi(n, a, b, c);
2, 同理,我们也就可以知道,将n-1个盘子从A移动到B通过C,即就是:
hanoi(n-1, a, b, c);
3, 但是我们知道我们一次只能移动一个盘子,所以,如果我们要将n个盘子从A移动到B通过C,我们可以将其分解为三步(对其进行递归,从难到易,知道移动完最后一个然后退出程序):
1,我们先将n-1个盘子从A移动到C通过B: hanoi(n-1, a, c, b);
2,然后我们就可以先将第n个盘子从A移动到B: move(n, a, b);
3,最后我们再将n-1个盘子从C移动到B通过A: hanoi(n-1, c, b, a);
程序:
#include <stdio.h>
void move(int n , char a, char b)
{
printf("第%d个盘子:从%c ---> %c\n",n, a, b);
}
void hanoi(int n, char a, char b , char c){ //将n个盘子从a移动到b经过c
if(n == 0)
return ;
hanoi(n-1, a , c , b); //将n-1个盘子从a移动到c经过b
move(n, a, b); //将第n个盘子从a移动到b;
getchar();
hanoi(n-1, c, b, a); //将n-1个盘子从c移动到b经过a
}
int main()
{
int n;
printf("plz input 盘子数n:");
scanf("%d", &n);
while(n<=0){
printf("抱歉,你输入的不合格!!!,请重新输入:\n");
scanf("%d", &n);
}
hanoi(n, 'A', 'B', 'C');
return 0;
}
运行结果:
值得注意的是:
我们写的程序应该能经得起一般的验证,
当直接写这个函数:
hanoi(3, 'A', 'B', 'C');
用户只能看到移动3个盘子的情况,不能验证其他情况,这样真的好吗??当n是由用户自己输入的情况下,那么可能会出现一些非法的情况,如n的输入值为负或者0的情况呢??
所以,我们应该让我们的程序鲁棒行强一点,让我们一起养成好习惯吧!!!