PTA 7-3 汉诺塔问题 (10 分)

该博客介绍了汉诺塔问题的起源和规则,并提供了一个C语言实现的汉诺塔程序。程序通过递归方式解决将所有圆盘从起始柱移动到目标柱的问题,遵循每次只能移动一个盘且大盘不能放在小盘上的原则。文章展示了输入圆盘数量及三根柱子标识后,程序输出的移动步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

汉诺塔是一个源于印度古老传说的益智玩具。据说大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘,大梵天命令僧侣把圆盘移到另一根柱子上,并且规定:在小圆盘上不能放大圆盘,每次只能移动一个圆盘。当所有圆盘都移到另一根柱子上时,世界就会毁灭。

请编写程序,输入汉诺塔圆片的数量,输出移动汉诺塔的步骤。

输入格式

圆盘数 起始柱 目的柱 过度柱

输出格式

移动汉诺塔的步骤
每行显示一步操作,具体格式为:
盘片号: 起始柱 -> 目的柱
其中盘片号从 1 开始由小到大顺序编号。

输入样例

3
a c b

输出样例

1: a -> c
2: a -> b
1: c -> b
3: a -> c
1: b -> a
2: b -> c
1: a -> c

参考 :

#include<stdio.h>
//AUTHOR:CHENG XIANGBO
void hanoi(int n,char ,char ,char );
int main(){
    int n;//运行次数为2^n-1次,64让计算机跑100年,平时测试上限为22
    scanf("%d",&n);
    getchar();//吃掉回车
    char a,b,c;
    scanf("%c %c %c",&a,&c,&b);
    hanoi(n,a,c,b);//hanoi(盘号,起始盘,目的盘,过度盘)
}
void hanoi(int n,char a,char c,char b){
    if(n==1)
        printf("1: %c -> %c\n",a,c);//直接把盘子A -> C
    else{
        hanoi(n-1,a,b,c);//hanoi(盘号-1,A -> B)
        printf("%d: %c -> %c\n",n,a,c);
        hanoi(n-1,b,c,a);//hanoi(盘号-1,B -> C)
    }
}
### 关于汉诺塔问题PTA平台上的解题思路 #### 经典汉诺塔问题概述 经典汉诺塔问题是递归算法中的典型例子。这个问题源自一个古老的印度传说,涉及三根子和若干不同尺寸的圆盘。目标是从起始将所有圆盘按照相同规则转移到目标上,在整个过程中遵循特定约束条件[^3]。 #### 使用额外辅助优化转移过程 对于标准版本之外的情况——即引入第四根辅助之后,可以显著减少所需步。传统方法下的最小移动为 \(2^n - 1\) ,其中 n 表示圆盘量;而借助额外的一根子,则可以通过更高效的策略实现更快捷的目标达成路径。 #### 动态规划求解方案 考虑到新增加了一个可用资源(即第四根),此变种形式允许采用动态规划的方法来进行解答。具体来说,就是利用前几轮已经计算好的最优解来推导当前状态的最佳解决方案。这种方法不仅提高了效率而且简化了逻辑复杂度。 ```python def hanoi_with_extra_rod(n, source=&#39;A&#39;, target=&#39;C&#39;, helper1=&#39;B&#39;, helper2=&#39;D&#39;): if n == 0: return [] elif n == 1: return [(source, target)] moves = [] # Move top (n-2) disks from A to B using C and D as helpers. moves += hanoi_with_extra_rod(n-2, source, helper1, helper2, target) # Move the next two largest discs directly between A -> D & D -> C or similar pattern depending on parity of N. moves.append((source, helper2)) moves.append((source, target)) moves.append((helper2, target)) # Finally move remaining (n-2) back onto final destination peg via alternate route involving all three other rods. moves += hanoi_with_extra_rod(n-2, helper1, target, source, helper2) return moves if __name__ == "__main__": print(hanoi_with_extra_rod(4)) # Example with four disks ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值