汉诺塔问题

落爺英雄遲暮 提交于 2020-02-06 21:18:13

算法思想

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

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!