汉诺塔求解_java


条件1:将问题拆解为第n个盘和n-1个盘

条件2:每次都是将n-1个盘看成整体移动到b,然后将第n个盘移动到c,然后n-1个盘重复上次操作

条件3:最小子问题就是当只有一个盘的时候

package StructDate;

/**
* Created with IntelliJ IDEA.
*
* @Author: 从南到北
* @Date: 12/07/2021/10:13
* @Description:

*
* @param n 一共需要移动的盘子
* @param a 盘子移动的起始柱子
* @param b 借助的柱子
* @param c 盘子需要移动到的目标柱子
*/

public class HanioTest {
public static void main(String[] args) {
int n = 4;
// int n = 1;
char a = 'A',b = 'B',c = 'C';
hanio(n,a,b,c);
}


public static void hanio(int n,char a, char b, char c){
//只有一个盘子的时候,就直接从A移到C
if(n == 1){
move(n,a,c);
}else{
//三步曲,注意观察,a,b,c三个的位置变化
//1.把 n-1 个盘子看成一个整体,借助 C 从 A 移动到 B
hanio(n-1,a,c,b);
//2.把第 n 个盘子从 A 移动到 C
move(n,a,c);
//3.再把 n-1 盘子整体,借助 A 从 B 移动到 C
hanio(n-1,b,a,c);
}
}

public static void move(int n , char a, char b){
System.out.println("把第"+ n +"个盘子从"+ a +"移到"+ b);
}
}

汉诺塔求解_java_02