汉诺塔--使用递归编写一个程序实现汉诺塔问题,要求在输入圆盘数量之后,输出圆盘的移动步骤,输出格式示例如下: 第1步:1号盘从A柱移至B柱 第2步:2号盘从A柱移至C柱

输入

多组测试用例,每组输入一个正整数n,n代表圆盘数量。

输出

每组输出之间有一行空行。
 

样例输入 Copy

3

样例输出 Copy

第1步:1号盘从A柱移至C柱
第2步:2号盘从A柱移至B柱
第3步:1号盘从C柱移至B柱
第4步:3号盘从A柱移至C柱
第5步:1号盘从B柱移至A柱
第6步:2号盘从B柱移至C柱
第7步:1号盘从A柱移至C柱
#include <stdio.h>
int step;
void  move(long long int n,char a,char b){
    printf("第%d步:%lld号盘从%c柱移至%c柱\n",++step,n,a,b);
}
 
void hanoi(long long int n,char a,char b,char c){
    if(n>0){
        hanoi(n-1,a,c,b);
        move(n,a,c);
        hanoi(n-1,b,a,c);
    }
}
int main(){
    long long int n;
    while(~scanf("%lld",&n)){
        hanoi(n,'A','B','C');
        step=0;
        printf("\n");
    }
}

 

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 汉诺塔游戏是一种经典的数学问题,其规则是将一堆圆盘从一根子转移到另一根子上,每次只能移动一个圆盘,且大圆盘不能放在小圆盘上面。 为了解决这个问题,我们可以使用递归算法。以下是用Java编写的演示汉诺塔游戏步骤的程序: ```java public class HanoiTower { public static void main(String[] args) { hanoi(3, 'A', 'B', 'C'); } public static void hanoi(int n, char source, char auxiliary, char target) { if (n == 1) { System.out.println("移动圆盘 " + n + " 从 " + source + " 到 " + target); } else { hanoi(n - 1, source, target, auxiliary); System.out.println("移动圆盘 " + n + " 从 " + source + " 到 " + target); hanoi(n - 1, auxiliary, source, target); } } } ``` 在以上代码中,我们定义了一个`hanoi`方法来实现递归的哈诺塔解决方案。其中`n`表示圆盘数量,`source`表示初始子,`auxiliary`表示辅助子,`target`表示目标子。 当圆盘数量为1时,直接将圆盘从初始移动到目标子上;当圆盘数量大于1时,先将`n-1`个圆盘从初始移动到辅助子上,然后将最大的圆盘从初始移动到目标子上,最后将`n-1`个圆盘从辅助移动到目标子上。 运行程序,将会按照汉诺塔的规则输出每一移动过程,直到将所有圆盘从初始移动到目标子上。 注意:以上代码中的`n`为圆盘数量,可以根据需要修改为其他的值来演示不同数量圆盘汉诺塔游戏步骤。 ### 回答2: 汉诺塔游戏是经典的递归问题,主要目标是将一组不同大小的圆盘从一根移动到另一根子上,同时遵守以下规则: 1. 每次只能移动一个圆盘; 2. 大圆盘不能放在小圆盘上面。 下面是一个使用Java编写汉诺塔游戏程序的示例,该程序包含了游戏的所有步骤: ```java public class HanoiTower { public static void hanoi(int n, char start, char middle, char end) { if (n == 1) { System.out.println("Move disc 1 from " + start + " to " + end); return; } hanoi(n - 1, start, end, middle); System.out.println("Move disc " + n + " from " + start + " to " + end); hanoi(n - 1, middle, start, end); } public static void main(String[] args) { int n = 3; // 圆盘数量 char start = 'A'; // 起始子 char middle = 'B'; // 中间子 char end = 'C'; // 目标子 hanoi(n, start, middle, end); } } ``` 在这个示例中,hanoi()函数使用递归的方式实现了汉诺塔游戏的移动步骤。首先判断如果只有一个圆盘时,直接将其从起始移动到目标子;否则,先将n-1个圆盘从起始移动到中间子,再将最后一个圆盘从起始移动到目标子,最后将n-1个圆盘从中间移动到目标子。通过不断递归调用hanoi()函数,直到所有圆盘移动到目标子上。 运行上述程序,输出结果如下: Move disc 1 from A to C Move disc 2 from A to B Move disc 1 from C to B Move disc 3 from A to C Move disc 1 from B to A Move disc 2 from B to C Move disc 1 from A to C 以上就是使用Java编写汉诺塔游戏步骤的简单示例。 ### 回答3: 汉诺塔游戏是一个经典的逻辑益智游戏,其规则是将一堆不同大小的圆盘从一根移动到另一根子,过程中要求始终保持大圆盘在下,小圆盘在上。下面是我用java编写汉诺塔游戏步骤的程序。 ```java public class HanoiTower { public static void main(String[] args) { int n = 3; // 圆盘数量 MoveTower(n, 'A', 'B', 'C'); // 调用汉诺塔移动函数 } // 汉诺塔移动函数 public static void MoveTower(int n, char source, char auxiliary, char target) { // 如果只有一个圆盘,则直接将其从源移动到目标 if (n == 1) { System.out.println("将圆盘从 " + source + " 移动到 " + target); } else { // 先将n-1个圆盘从源移动到辅助 MoveTower(n - 1, source, target, auxiliary); // 将最大的圆盘从源移动到目标 System.out.println("将圆盘从 " + source + " 移动到 " + target); // 再将n-1个圆盘从辅助移动到目标 MoveTower(n - 1, auxiliary, source, target); } } } ``` 运行以上程序后,控制台将打印出汉诺塔游戏的每一移动操作。其中,圆盘编号用A、B、C分别表示三根子。例如,将圆盘从A移动到C,将打印 "将圆盘从 A 移动到 C"。通过这个程序,我们可以清楚地看到完成汉诺塔游戏的每一操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值