汉诺塔
先带大家了解一下汉诺塔。
相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。
例:先用三个盘子分析一下解题思路——
1、先是给A柱上放三个盘子,标号为1(顶层)、2(中层)、3(底层),刚好符合从大到小;
2、再把1和2看成一个整体,因此A柱上的盘子就有两个,(1,2)(顶层)、3(底层);
3、先把(1,2)盘移到B柱上,再把3移到C柱上;
4、这下把(1,2)又分开,就成了1、2,并且都在B柱上,现在又把1移到A柱上;
5、再把2移到C柱上,再把最后一个盘子1移到C柱上,目标达成。
如果为64个盘子————先把前面63个看成一个整体,64因此就被分为两个部分,接着把63又分为两个部分,前62个盘子和63, 以此类推。具体实现步骤如下:
import java.util.Scanner;
/*
汉诺塔————要求:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。
操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,
小盘在上,操作过程中盘子可以置于A、B、C任一杆上。
在整个过程中具体所要注意的事项是:
1、有三根柱子,分别为:A(起始柱)、B(辅助柱)、C(目标柱)
2、A柱上拥有64个盘子,一次是从下到上,从大到小(即大盘在下面,小盘在上面)
3、每一次只能移动一个盘子,并且每一根柱上都得是大盘在下,小盘在上
4、最终把A柱上的盘子全部移动到C柱上
先用三个盘分析一下思路:
再分析思路之前先介绍一下递归,什么是递归?
递归算是一种解题的思想,就是把大问题化小,再把小的问题合并成最终所想要的结果。例:形如下面二叉树
9
4 5
1 3 2 3
1 2 1 1 1 2
·······
2——(1,1)
3——(1,2)
4——(1,3)
1
9——(4,5)
2——(1,1)
5——(2,3) 1
3——(1,2)
2——(1,1)
先是由大到小一层的一层分,之后又从小返回到大,整个过程就叫做递归。
具体思路:
1、先是给A柱上放三个盘子,标号为1(顶层)、2(中层)、3(底层),刚好符合从大到小;
2、再把1和2看成一个整体,因此A柱上的盘子就有两个,(1,2)(顶层)、3(底层);
3、先把(1,2)盘移到B柱上,再把3移到C柱上;
4、这下把(1,2)又分开,就成了1、2,并且都在B柱上,现在又把1移到A柱上;
5、再把2移到C柱上,再把最后一个盘子1移到C柱上,目标达成。
如果为64个盘子,也是运用递归的思想————先把前面63个看成一个整体,64因此就被分为两个部分,接着把63又分为两个部分,前62个盘子和63,
以此类推。
具体实现步骤如下:
*/
class Test02{
public static void main(String[] args){
Scanner input=new Scanner(System.in);
System.out.print("请输入层数n:");
int n=input.nextInt();
System.out.print("请输入A、B、C:");
String str1=input.next();
String str2=input.next();
String str3=input.next();
hanNuo(n,str1,str2,str3);
}
public static void hanNuo(int n,String str1,String str2,String str3){
if(n==1){
System.out.println(str1+"->"+str3);
}else{
hanNuo(n-1,str1,str3,str2);
System.out.println(str1+"->"+str3);
hanNuo(n-1,str2,str1,str3);
//System.out.println(str2+"->"+str3);
}
}
}
谢谢大家·········
来源:CSDN
作者:Tough_dxx
链接:https://blog.csdn.net/Tough_dxx/article/details/104286617