首页 > 学院 > 开发设计 > 正文

汉诺塔问题

2019-11-06 08:28:09
字体:
来源:转载
供稿:网友

1)在把n个盘子从A移动到C的过程中,必然存在一步,是把最大的盘子从A拿出来。要想把最大的盘子从A移动到别的某个柱子上(B或C),就必须保证剩下的n-1个盘子不能碍事,得好好堆在剩下那个柱子(C或B)上。要保证n-1个盘子都在剩下那个柱子上,至少得付出F(n-1)次移动。

2)在把n个盘子从A移动到C的过程中,必然存在一步,是最大的盘子被放到了C上,而且此后再也没动过。在这步实行之前,最大的盘子要么在A要么在B上,而相应地别的n-1个盘子要么在B要么在A上。在这步实施之后,我们只要花至少F(n-1)的步数把n-1个盘子从要么B要么A挪动到C上就行了。这些步数必然和1)中的步数不重叠,因为这时候最大盘子在C上,而1)中最大盘子在A上。

3)最大的盘子至少被挪动了一次。而且这一次肯定没被算在1)或2)的“至少F(n-1)步”中,因为后者只挪动较小的那n-1个盘子。

把1),2),3)加起来,就是至少F(n-1) + F(n-1) + 1步。不能再少了。
#include<stdio.h>#include<stdlib.h>void move(char x,char y)//打印步骤{	PRintf("%c-->%c/n",x,y);}void hanio(int n,char one ,char two,char three){	if(n==1)	{		move(one,three);	}else{		hanio(n-1,one,three,two);//把n-1个盘子移动到借用塔上		move(one,three);		hanio(n-1,two,one,three);	}}int main(){  int n;  printf("please input the number of dishes:/n");  scanf("%d",&n);  hanio(n,'A','B','C');  system("pause");}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表