汉诺塔问题

汉诺塔问题:

如上图所示,将N个盘子从A移到C上,每次只能移动一个盘子,且保证任何时候小盘子上都不能放大盘子。

看到这类问题,首先我们可以根据简单的数据进行推理,比如:
1.有3个盘子,我们若需要将3个盘子从A移动到C,那么我们只需要保证先将两个盘子从A移动到B,将最下面的盘子移动到C,再B中的两个盘子移动到C。

2.而如果有4个盘子,那么我们只需要将上面三个盘子从A移动到B,将最下面的盘子移动到C。再将B中的3个盘子移动到C。

此时我们发现了规律:有4个盘子,我们只要模拟出3个盘子移动的过程两次(由A到B,再由B到C),再加上中间一次最大盘子从A到C就可实现。
那么3个盘子移动的整个过程是由A到C的,我们此时需要两次这个过程,第一次需要将3个盘子的移动过程A->C中的C变成B,此时就会变成A->B的结果,完成之后我们需要恢复原态。同理,第二次就是将A变成B。

推理得出:
有N个盘子时,我们只需要知道N-1的过程就可以得出结果。此时使用递归就可以帮我们解决这个问题。

char A='A';
char B='B';
char C='C';

void swap(char *a,char *b)
{
	char tmp=*a;
	*a=*b;
	*b=tmp;
}
void Fun(int n)
{
	if(n==2)
	{
		cout<<A<<"->"<<B<<endl;
		cout<<A<<"->"<<C<<endl;
		cout<<B<<"->"<<C<<endl;
	}
	else
	{
		swap(&B,&C);
		Fun(n-1);
		swap(&B,&C);

		cout<<A<<"->"<<C<<endl;
		
		swap(&A,&B);
		Fun(n-1);
		swap(&A,&B);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值