Hanoi塔问题
来源:互联网 发布:影响二次销售 淘宝介入 编辑:程序博客网 时间:2024/05/29 13:39
设a,b,c是3个塔。开始时,在塔座a上有一叠共n个圆盘,这些圆盘自下而上,由大到小地叠在一起。各圆盘从小到大编号为1,2,3,...,n,如图2-1所示。现要求将塔座a上的这一叠圆盘移到塔座b上,并按照同样顺序重叠。在移动圆盘时应该遵守以下移动规则。
规则(1):每次只能移动1个圆盘;
规则(2):任何时刻都不允许将较大的圆盘压在较小的圆盘之上;
规则(3):在满足移动规则(1)和规则(2)的前提下,可将圆盘移至a,b,c中任一座塔上。
算法理解:
假设塔座a,b,c排成一个三角形,a——>b——>c——>构成一个顺时循环,在移动圆盘的过程中,若是奇数次移动,则将最小的圆盘顺时针移动下一个塔座;若是偶数次移动,则最小的圆盘不动,移动另外两个塔座上的圆盘,将较小的圆盘移到另一个塔座上。
递归方法:
即先将最小的盘从a塔座移到b塔座,剩下的n-1个盘借助a,b塔座移动到c 塔座,然后将最小的盘移到a塔座,将n-1个盘移到b盘,最后将最小的圆盘移到b盘。
代码如下:
package cn.aaa;
import java.util.Scanner;
public class Hanoi {
//汉诺塔问题解决方法
public static void Hanoi(int n,char a,char b,char c) {//a是初态,b是终态,c是中间媒介
if(n==1){
swap(a,b);
}else{
Hanoi(n-1,a,c,b);//将n-1个盘从a移到c
swap(a,b); //将第n个盘从a移到b
Hanoi(n-1,c,b,a);//将之后n-1(其实现在是n-2)个盘从c移动到b
}
}
//交换函数
public static void swap(char a,char b) {
System.out.println(a+">>"+b);
}
public static void main(String[] args) {
int n;
System.out.println("请输入一个正整数n:");
Scanner s = new Scanner(System.in);
n = s.nextInt();
System.out.println("圆盘的移动为:");
Hanoi(n,'A','B','C');
}
}
结果如下:
- Hanoi双塔问题(hanoi)
- Hanoi塔问题
- Hanoi塔问题(C)
- 双色Hanoi塔问题
- 双色Hanoi塔问题
- Hanoi 塔问题
- Hanoi塔问题
- Hanoi双塔问题
- Hanoi塔问题
- Hanoi(汉诺)塔问题
- 数据结构-Hanoi塔问题
- Hanoi塔问题
- Hanoi(汉诺)塔问题
- Hanoi塔问题
- 双色Hanoi塔问题
- hanoi塔问题
- hanoi塔问题
- Hanoi塔问题
- 使用OAuth2的SSO分析
- 三极管开关电路设计
- poj 2549
- HDU:1878 欧拉回路(并查集+欧拉回路)
- FOJ FZU 2112 Tickets【欧拉通路】
- Hanoi塔问题
- Python Requests安装
- 文件读取的四种方式
- JFinal框架简单学习
- 第5周项目1 三角形4
- smdk210 构建根文件系统
- C语言编程在Xcode中Scanf 输入跳过以及清空键盘缓冲区总结
- 读取文件中的内容
- CodeForces 659A Round House(水题)