PTA 7-343 汉诺(Hanoi)塔问题

PTA 7-343 汉诺(Hanoi)塔问题

分数 20
作者 张高燕
单位 浙大城市学院

古代某寺庙中有一个梵塔,塔内有3个座A、B和C,座A上放着64个大小不等的盘,其中大盘在下,小盘在上。有一个和尚想把这64 个盘从座A搬到座B,但一次只能搬一个盘,搬动的盘只允许放在其他两个座上,且大盘不能压在小盘上。现要求用程序模拟该过程,输入一个正整数n,代表盘子的个数,编写函数

void hanoi(int n,char a,char b,char c)
其中,n为盘子个数,从a座到b座,c座作为中间过渡,该函数的功能是输出搬盘子的路径。

输入格式:
输入在一行中给出1个正整数n。

输出格式:
输出搬动盘子路径。

输入样例:
3
输出样例:
a–>b
a–>c
b–>c
a–>b
c–>a
c–>b
a–>b

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

#include<stdio.h>

void hanoi(int n, char a, char b, char c){
	if(n == 1)
        printf("%c-->%c\n", a, b);    //递归截止条件
	else{
		n--;
		hanoi(n, a, c, b);
		printf("%c-->%c\n", a, b);    //这时候的A-->B塔的名字取决于最开始没有改变名字的A塔B塔
		hanoi(n, c, b, a);
    }
}

int main(){
	char a = 'a', b = 'b', c = 'c';
    int n;
    scanf("%d", &n);
	hanoi(n, a, b, c);
    return 0;
}

解题思路:
step1:将起始柱上的 n-1 个圆盘移动到辅助柱上;
step2:将起始柱上遗留的 1 个圆盘移动到目标柱上;
step3:将辅助柱上的所有圆盘移动到目标柱上。

归属知识点:
递归

### 关于汉诺问题PTA平台上的解题思路 #### 经典汉诺问题概述 经典汉诺问题是递归算法中的典型例子。这个问题源自一个古老的印度传说,涉及三根柱子和若干不同尺寸的圆盘。目标是从起始柱将所有圆盘按照相同规则转移到目标柱上,在整个过程中遵循特定约束条件[^3]。 #### 使用额外辅助柱优化转移过程 对于标准版本之外的情况——即引入第四根辅助柱之后,可以显著减少所需步数。传统方法下的最小移动次数为 \(2^n - 1\) ,其中 n 表示圆盘数量;而借助额外的一根柱子,则可以通过更高效的策略实现更快捷的目标达成路径。 #### 动态规划求解方案 考虑到新增加了一个可用资源(即第四根柱),此变种形式允许采用动态规划的方法来进行解答。具体来说,就是利用前几轮已经计算好的最优解来推导当前状态的最佳解决方案。这种方法不仅提高了效率而且简化了逻辑复杂度。 ```python def hanoi_with_extra_rod(n, source='A', target='C', helper1='B', helper2='D'): 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、付费专栏及课程。

余额充值