7-49 汉诺塔问题* (10分)

it2025-12-14  8

7-49 汉诺塔问题* (10分)

汉诺塔是一个源于印度古老传说的益智玩具。据说大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着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

分析:

假设有3个盘子,要从a移动到c。

将第1个盘子从a移动到c,再将第2个盘子从a移动到b,接着将第1个盘子从从c移动到b,再将第3个盘子从a直接移动到c。然后将第1个盘子从b移动到a,再将第2个盘子从b移动到c,再将第1个盘子从a直接移动到c。

假设有n个盘子,要从a移动到c。

将n-1个盘子借助c移动到b,再将n直接移动到c。接着,将n-1个盘子借助a移动到c,可以看出,这是一个简单的递归问题。

伪代码:

if(n==1) { 将第n个盘子直接移动到c } else { 将n-1个盘子从a借助c移动到b 将第n个盘子直接移动到c 将n-1个盘子从b借助a移动到c }

代码:

#include<iostream> using namespace std; void hannuota(int n,char c1,char c2,char c3)//n个盘子从c1借助c2移动到c3 { if(n==1) { printf("%d: %c -> %c\n",n,c1,c3); } else { hannuota(n-1,c1,c3,c2); printf("%d: %c -> %c\n",n,c1,c3); hannuota(n-1,c2,c1,c3); } } int main() { int n; cin>>n; char c1,c2,c3; cin>>c1>>c2>>c3; hannuota(n,c1,c3,c2);//n个盘子从c1借助c2移动到c3 return 0; }

因题目要求输入为:圆盘数 起始柱 目的柱 过度柱

因此传参时需要将c2,c3调换位置

最新回复(0)