package ChongXingZuo;
/**汉诺塔(典型的使用递归法的问题):
* 假设有1,2,3号三根木柱和n个大小均不相同的盘子,
* 从小到大编号为1,2,3,4,····,n,编号越大的盘子直径越大,
* 最开始n个盘子都在1号木柱上,现在通过2号木柱把全部盘子移到3号木柱,
* 并且找出移动次数最少的方法。
* 规则:
* 1、每次只能移动1次,而且只能从最上面的盘子移动;
* 2、直径较小的盘子永远在直径较大的盘子上;
* 3、盘子可任意地从任何一个木柱移到另一个木柱上。
* 解答(如果有n个盘子):
* 步骤1:将n-1个盘子从1号木柱移到木柱2;
* 步骤2:将第n个最大的那个盘子移到木柱3;
* 步骤3:将n-1个盘子从2号木柱移到木柱3。
*
*@author 暮之沧蓝
*/
import java.util.Scanner;
public class HanNuoTa {
public static int count=0;
public static void HanNuoTa(int n,int m1,int m2,int m3) {
if(n==1) {
System.out.println("盘子从"+m1+"移到"+m3);
count++;
}else {
HanNuoTa(n-1,m1,m3,m2); //把n-1个盘子全部从1号木柱移动到2号木柱
System.out.println("盘子从"+m1+"移到"+m3);
//把最底下的第n个盘子从1号木柱移动到3号木柱
count++;
HanNuoTa(n-1,m2,m1,m3); //在把n-1个盘子从2号木柱移动到3号木柱上
}
}
public static void main(String[] args) {
System.out.println("请输入盘子的数量:");
Scanner in=new Scanner(System.in);
int n=in.nextInt();
System.out.println("\n结果为:");
HanNuoTa(n,1,2,3);
System.out.println("\n一共移动了"+count+"次");
/**直接计算盘子移动的次数:
* package ChongXingZuo;
*
*public class HanNuoTa {
*
*import java.util.Scanner;
*public static int HanNuoTa(int n,int m1,int m2,int m3) {
* int count=0;
* if(n==1) {
* return 1;
* }else {
* return count+HanNuoTa(n-1,m1,m3,m2)+HanNuoTa(n-1,m2,m1,m3)+1;
* }
* }
* public static void main(String[] args) {
* System.out.println(HanNuoTa(3,1,2,3)); //第一个数为多少个盘子
* }
*}
*/
}
}
Java:汉诺塔(递归方法解决)
最新推荐文章于 2023-11-05 16:16:46 发布