算法思想
对于汉诺塔问题,当只移动一个圆盘时,直接将圆盘从 A 针移动到 C 针。若移动的圆盘为 n(n>1),则分成几步走:把 (n-1) 个圆盘从 A 针移动到 B 针(借助 C 针);A 针上的最后一个圆盘移动到 C 针;B 针上的 (n-1) 个圆盘移动到 C 针(借助 A 针)。每做一遍,移动的圆盘少一个,逐次递减,最后当 n 为 1 时,完成整个移动过程。
因此,解决汉诺塔问题可设计一个递归函数,利用递归实现圆盘的整个移动过程,问题的解决过程是对实际操作的模拟。
其数学规律:
设f(n)为将n个圆盘移动到目标针的步数。则将n个盘从原有针x移动到目标针Y时:
(1)先将第1到第n-1个盘从目标针X移动到多余针Z上,即需要f(n-1)步。
(2)将原有针的第n盘移到至目标针Y,即需要1步。
(3)将第1到第n-1个盘从多余针Z移动到目标针Y上,即需要f(n-1)步。 、故f(n)=2f(n-1)+1-> f(n)+1=2[f(n-1)+1]->f(n)+1=[2^(n-1)]* [f(1)+1]。
因为f(1)=1,故f(n)=2^n-1;可得出移动n个盘子需要经历2^n-1步。
#include<stdio.h>
#include<ctype.h>
#include <stdlib.h>
void move(char one,char two);
void han(int n,char one,char two,char three);
void move(char one,char two){
printf("%c-->%c\n",one,two);
}
void han(int n,char one,char two,char three){
if(n==1){
move(one,three);//将盘从A到C
}else{
han(n-1,one,two,three);//将n-1盘 从A座借助C座移到B座
move(one,two);//将剩下的一盘从A座 移到C座
han(n-1,three,one,two);//将n-1盘从B座借助A座移到C座
}
}
int main(void){
int n;
printf("请输入盘的数目:");
scanf("%d",&n);
char one='A',two='B',three='C';
// char one,two,three;
// printf("请输入三个针的名称:(例如输入 A B C)\n");
// scanf("%c %c %c\n",&one,&two,&three);
han(n,one,two,three);
return 0;
}
来源:CSDN
作者:瓦中空花
链接:https://blog.csdn.net/lankongyiqu/article/details/104182329