汉诺塔(移动方案)

问题描述

设有3个分别命名为X、Y和Z的塔座,在塔座X上有n个直径各不相同的盘片,从小到大一次编号为1、2、..n。现要求将X塔座上的这n个盘片移到塔座Z上并仍按同样的顺序叠放,盘片移动时必须遵守一下规则:每次只能移动一片盘片;盘片可以插在X、Y和Z中的任一塔座上;任何时候都不能将一个较大的盘片放在较小的盘片上。

思路

采用递归求解。将n个盘片从X移到Y,等同于先将n-1个从X移到Z(从小到大叠放),然后将剩下的一个移动到Y,再将原来的n-1个从Y移到Z。

剩下的一个总是最大的,所以不会违反规则。最大的到达目的地后,可直接忽略掉,问题规模就减少1了。

代码

 1 #include<stdio.h>
 2 
 3 //表示将n个盘片从X塔座,借助Y塔座,移动到Z塔座
 4 void Hanoil(int n, char X, char Y, char Z)
 5 {
 6     if (n == 1)
 7         printf("\t将第%d个盘片从%c移动到%c\n", n, X, Z);
 8     else
 9     {
10         Hanoil(n - 1, X, Z, Y);
11         printf("\t将第%d个盘片从%c移动到%c\n", n, X, Z);
12         Hanoil(n - 1, Y, X, Z);
13     }
14 }
15 
16 int main()
17 {
18     int n;
19     char names[] = { 'X','Y','Z' };
20     printf("盘片的个数:");
21     scanf("%d", &n);
22     Hanoil(n, names[0], names[1], names[2]);
23 
24     return 0;
25 }

 

转载于:https://www.cnblogs.com/lfri/p/9890406.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值