汉诺塔问题

算法思想

对于汉诺塔问题,当只移动一个圆盘时,直接将圆盘从 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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值