汉诺塔问题

汉诺塔(tower of hanoi)有三个木桩,有数量大小不同的盘子,每个木桩放置要求:
1.直径达的盘子永远只能放在直径小的下面
2.每次只能移动一个盘子
两个盘子的移动
1----->2
1----->3
2----->3
在这里插入图片描述
n-1---->2
n----->3
n-1----->3
hanoi(n-1, p1, p3, p2);
将n-1个盘子从p1绕过p3移到p2
换而言之,就是将p3当作辅助盘,将n-1个盘从p1移到p2
hanoi(n-1, p2, p1, p3);
将n-1个盘子从p2绕过p1移到p3
换而言之,就是将p1当作辅助盘,将第n个盘从p2移到p3

假如有三个盘子
将两个小盘子看作n-1 从p1移到p2,借助p3的辅助

1---->3
1---->2
3---->2
将第n个盘子从p1移到p3
1---->3
将n-1 个盘子从p2移到p3,借助p1的辅助
2---->1
2---->3
1---->3

  hanoi(int n,int p1,int p2,int p3 )
{
	if(n==1)
	cout<<"盘子从"<<p1<<" to "<<p3<<endl;
	else
	{      	hanoi(n-1, p1, p3, p2);//找到第一个盘子 
		cout<<"盘子从 "<<p1<<" 移到 "<<p3<<endl;
		hanoi(n-1, p2, p1, p3);
	}

	
}
int main()
{
	hanoi(3,1,2,3);
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值