递归算法——Hanoi(汉诺)问题(Java实现&C语言实现)
2016-10-13 19:52
344 查看
某寺庙前有三根柱子A、B、C,开始时A柱上有n个盘子,盘子大小不等,大的在下、小的在上(下图所示)。有一老和尚想把这n个盘子从A柱移到C柱上,但每次只允许移动一个盘子,且在移动过程序中每根柱子上都始终保持大盘在下、小盘在上。在移动过程中可以借助B柱。要求:正整数n由键盘输入。
Java实现:
输出结果:
请输入A塔上盘子的个数
请输入一个整数后按回车键:
3
把编号为[1]盘从A 移动到 C
把编号为[2]盘从A 移动到 B
把编号为[1]盘从C 移动到 B
把编号为[3]盘从A 移动到 C
把编号为[1]盘从B 移动到 A
把编号为[2]盘从B 移动到 C
把编号为[1]盘从A 移动到 C
C语言实现:
输出结果:
请输入A塔上盘子的个数
请输入一个整数后按回车键:
3
把编号为[1]盘从 A 移动到 C
把编号为[2]盘从 A 移动到 B
把编号为[1]盘从 C 移动到 B
把编号为[3]盘从 A 移动到 C
把编号为[1]盘从 B 移动到 A
把编号为[2]盘从 B 移动到 C
把编号为[1]盘从 A 移动到 C
Press any key to continue
Java实现:
import java.util.Scanner; public class Test160916 { public static void main(String[] args) { System.out.println("请输入A塔上盘子的个数"); System.out.println("请输入一个整数后按回车键:"); Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); hanoi(n, 'A', 'B', 'C'); scanner.close(); } public static void move(char x, int n, char y){ System.out.println("把编号为["+n+"]盘从"+x+" 移动到 "+y); } public static void hanoi(int n,char A,char B,char C){ if(n==1){ move(A,1,C); }else{ /* 步骤 * 第一步,移走最上面的盘子,剩下一个最大的 * 第二步,把最大的盘子移到目标盘 * 第三步,移回第一步的盘子到目标盘 */ hanoi(n-1,A,C,B);//借助 【C】 把n-1个盘从【A】移到 【B】 move(A,n,C);//把最大的盘子移动到【C】 hanoi(n-1,B,A,C);//借助 【A】 把n-1个盘从【B】移到 【C】 } } }
输出结果:
请输入A塔上盘子的个数
请输入一个整数后按回车键:
3
把编号为[1]盘从A 移动到 C
把编号为[2]盘从A 移动到 B
把编号为[1]盘从C 移动到 B
把编号为[3]盘从A 移动到 C
把编号为[1]盘从B 移动到 A
把编号为[2]盘从B 移动到 C
把编号为[1]盘从A 移动到 C
C语言实现:
#include <stdio.h> void move(char x, int n, char y){ printf("把编号为[%d]盘从 %c 移动到 %c \n",n,x,y); } void hanoi(int n,char A,char B,char C){ if(n==1){ move(A,1,C); }else{ /* 步骤 * 第一步,移走最上面的盘子,剩下一个最大的 * 第二步,把最大的盘子移到目标盘 * 第三步,移回第一步的盘子到目标盘 */ hanoi(n-1,A,C,B);//借助 【C】 把n-1个盘从【A】移到 【B】 move(A,n,C);//把最大的盘子移动到【C】 hanoi(n-1,B,A,C);//借助 【A】 把n-1个盘从【B】移到 【C】 } } int main() { int n; printf("请输入A塔上盘子的个数\n"); printf("请输入一个整数后按回车键:\n"); scanf("%d",&n); hanoi(n, 'A', 'B', 'C'); return 0; }
输出结果:
请输入A塔上盘子的个数
请输入一个整数后按回车键:
3
把编号为[1]盘从 A 移动到 C
把编号为[2]盘从 A 移动到 B
把编号为[1]盘从 C 移动到 B
把编号为[3]盘从 A 移动到 C
把编号为[1]盘从 B 移动到 A
把编号为[2]盘从 B 移动到 C
把编号为[1]盘从 A 移动到 C
Press any key to continue
相关文章推荐
- 递归算法——求Fibonacci数列前n项(Java实现&C语言实现)
- 八皇后问题之回溯算法实现<java实现>
- 数字问题之二进制1数问题<Java实现>
- Hanoi(汉诺)塔问题(C实现)
- java基于递归算法实现汉诺塔问题实例
- Hanoi(汉诺)塔问题(C实现)
- 问题1:java中没有实现这种“byte a = 0xB2 --> String b = “B2””转换的简单实现需要自己实现。 答:自己编写的转换函数,思路将byte的高低4位分开,分别转换为对应的字符然后合成返回的字符串。 java 代码 1.
- 用递归法:设计算法求解汉诺塔问题,并编程实现。 (1) Hanoi(汉诺)塔问题分析 这是一个古典的数学问题,是一个用递归方法解题的典型例子。问题是这样的:古代有一个梵塔,塔内有3个座 A,B,C
- 日历的问题C语言,C++(boost),python,Javascript,Java和Matlab实现
- hanoi(汉诺)塔问题C++的递归实现
- 递归算法之排队购票问题(未名湖边的烦恼)java实现
- 链表问题之链表反转<Java实现>
- 经典线程同步问题(生产者&消费者)--Java实现
- 数字问题之阶乘零数问题<Java实现>
- c语言:Hanoi(汉诺)塔问题,求移动盘子的步骤
- 关于微软面试题:"四人过桥"问题的思考——“n人过桥”问题的演进(Java实现)
- 链表问题之无头单链表删节点<Java实现>
- 数组问题之数组最值问题<Java实现>
- 字符串问题之串移包含问题<Java实现>
- c语言:Hanoi(汉诺)塔问题,求移动盘子的步骤