Hanoi塔问题【递归】

(n阶Hanoi塔问题)假设有三个分别命名为A、B、C的塔座,在塔座A上插有n(n<20)个直径大小各不相同、依小到大编号为1,2,…,n的圆盘。现要求将A轴上的n个圆盘移至塔座C上并仍按同样顺序叠排,圆盘移动时必须遵循下列规则: 1)每次只能移动一个圆盘; 2)圆盘可以插在A、B、C中的任一塔座上; 3)任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。 请通过编程来打印出移动的步骤.


Hanoi问题绝对是一个理解递归的好题,对一个将N个圆盘从A移动到C的问题,我们可以将它分解成三步

  • 将其上的N-1个圆盘从A移动到B。
  • 将第N个圆盘从A移动到C。
  • 将B上的N-1个圆盘移动到C。

每次移动都有一个起点S,一个终点T,还有一个中介M,另外还有想要移动的盘子的数目cnt,当需要移动的数目为1时,我们就可以打印移动的方法。写成程序就是下面这样

//将cnt个圆盘从S盘经过M移动到T
void hanoi(char S, char T, char M, ll cnt) {
	if (cnt == 1)
		pprint(S, T);
	else {
		hanoi(S, M, T, cnt - 1);//把上面cnt-1个硬盘从S经过T移动到M
		hanoi(S, T, M, 1);//把最底下的1个硬盘移动到T
		hanoi(M, T, S, cnt - 1);//把移动到M上的cnt-1个硬盘通过S移到终点T
	}
}

然后就是需要注意路径的打印五个一组,使用一个全局变量进行监控即可

#define ll int
#define inf 0x3ffffff
#define vec vector<ll>

ll tot = 0;

void pprint(char s, char t) {
	if (tot == 5)printf("\n"), tot = 0;
	printf("%c-->%c   ", s, t); tot++;
}
//将cnt个圆盘从S盘经过M移动到T
void hanoi(char S, char T, char M, ll cnt) {
	if (cnt == 1)
		pprint(S, T);
	else {
		hanoi(S, M, T, cnt - 1);//把上面cnt-1个硬盘从S经过T移动到M
		hanoi(S, T, M, 1);//把最底下的1个硬盘移动到T
		hanoi(M, T, S, cnt - 1);//把移动到M上的cnt-1个硬盘通过S移到终点T
	}
}

int main() {
	ll n;
	while (cin >> n && n) {
		hanoi('A', 'C', 'B', n);
		printf("\n"); tot = 0;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值