需求:有三根柱子,分别为起始柱子、中间柱子和目标柱子,起始柱子上有圆盘,按从小到大的顺序摆放。需要将起始柱子上的圆盘全部挪到目标柱子上,在挪动的过程中可以借助中间柱子,每次只能挪动一个圆盘,而且每根柱子上的圆盘都是按从小到大的顺序摆放的。
思路:
1、当有一个圆盘的时候,可以直接将圆盘从其实柱子上挪到目标柱子上。
2、当有两个圆盘的时候,就需要借助中间柱子来进行挪动,具体的挪动步骤是:想将起始柱子上的第一个圆盘挪到中间柱子上,然后将起始柱子上的第二个圆盘挪到目标柱子上,最后将第一个圆盘移动到目标柱子上,完成整个挪动的过程。
3、当有三个圆盘的时候,挪动的具体步骤是:1)将起始柱子上的第一个圆盘挪到目标柱子上,将第二个圆盘挪到中间柱子上,2)将第一个圆盘移动到中间柱子上,将起始柱子上的第三个圆盘移动到目标柱子上,3)将第一个圆盘挪到起始柱子上,将第二个圆盘挪到目的柱子上,4)最后将第一个圆盘挪到目标柱子上,完成整个挪动的过程。
4、当有n个圆盘的时候,先将前n-1个圆盘从起始柱子上借助目标柱子挪到中间柱子上,然后将第n个圆盘从起始柱子桑挪到目标柱子上,然后将剩下的n-1个圆盘从中间柱子上挪到目标柱子上,借助起始柱子。
终上所述:当只有一个圆盘的时候,直接挪就可以,当有两个或以上圆盘挪动的时候就要借助于中间的柱子才能完成整个的挪动的过程。所以在写程序的时候,可以先定义一个移动函数,里面有三个参数,分别是圆盘的个数,起始柱子和目标柱子,用这函数来表示将第n个圆盘从起始柱子挪到目标柱子的过程。然后再定义一个函数,有四个参数,分别是圆盘的个数,起始柱子,中间柱子和目标柱子,这个函数的功能是将这n个圆盘从起始柱子挪到目标柱子上。具体方法是先判断n==1的情况,这时直接调用移动的函数,其余的情况都是借助中间的柱子,第一步:将前n-1个圆盘借助目标柱子从起始柱子挪到中间柱子上,所以调用其本身,不过里面的参数分别是n-1,起始柱子,目标柱子和中间柱子。第二步是调用移动的方法,将第n个圆盘从起始柱子挪到目标柱子上。第三步是将剩下的n-1个柱子借助起始柱子挪到目标柱子上,所以调用其本身,参数的顺序是n-1,中间柱子,起始柱子和目标柱子。这样就完成了两个方法的设计,直接在主函数中调用第二个方法就能实现整个挪动的过程。
具体代码实现如下:
package com.shangzhenwei.hano;
import java.util.Scanner;
public class Hano {
static int i=1;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入圆盘的个数:");
int n=sc.nextInt();
hano(n,'A','B','C');
}
public static void move(int n,char from,char to){
System.out.println("第"+(i++)+"步操作:将"+n+"号圆盘移动::"+from+"=====>"+to);
}
public static void hano(int n,char from,char mid,char to){
if(n==1){
move(n, from, to);
}else{
//借助目标塔将n-1个圆盘移动到中间塔上
hano(n-1, from,to,mid);
//将第n个圆盘移动到目标塔上
move(n, from, to);
//将中间塔上的圆盘借助起始塔移动到目标塔上
hano(n-1, mid, from,to);
}
}
}
结果如图: