首先解决汉诺塔问题我们需要知道什么是汉诺塔。
如图:
通过图片我们知道汉诺塔,其实就是将A柱上面的盘子,借助B柱子移动上C柱上。
由此,我们对于这个问题可以通过递归方法来实现,那么怎么递归呢。
我们假设一个简单的,
当A柱上有2个盘子时,其步数为:
A -> B , A -> C , B -> C。总共3步
当A柱上有3个盘子时,其步数为:
A -> C , A -> B , C -> B , A -> C , B -> A , B ->C , A -> C。总共7步
通过以上规律我们可以发现,都是要先把A柱最后一个盘子上的所有盘子先移到B柱上面,把最后一个盘子放在C盘子上,然后再把B柱上的盘子放到C上。
假设: A柱上有n个盘子,
1. 我们需要先把A柱上的 n-1 个盘子放到B柱上,然后把最后A柱上的最后一个盘子放到C柱上。
2. 此时B柱上有 n-1 个盘子,然后把B柱上,最后一个盘子上 n-2 个盘子放到A柱上,然后把B柱的盘子放到C柱上。
3. 经过两次交换我们发现我们已经把原来A柱子上,最后两个盘子依次放到了C盘子上,此时的A柱上,有 n-2 个盘子。我们发现此时和之前的一样,依次递归就可以实现。
汉诺塔图解:
这里是假设的第一步,第二步可以自己尝试画画更好理解。
代码:
import java.util.Scanner;
public class Main {
static int count = 0;//定义一个全局变量,用来统计个数。
public static void move(char pos1, char pos2){
System.out.print(pos1 + "->" + pos2 + " ");//打印移动去向。
count++;//移动次数加一。
}
public static void hanoi(int x, char pos1, char pos2, char pos3){
if(x == 1){
move(pos1 , pos3);//移动最后一次终止,开始回归。
return;
}
hanoi(x-1 , pos1 , pos3 , pos2);//从A柱借助C柱行动上B柱。
move(pos1 , pos3);
hanoi(x-1 , pos2 , pos1 , pos3);//从B柱借助A柱行动上C柱。
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
hanoi(n , 'A' , 'B' , 'C');
System.out.println();
System.out.print(count);//打印移动总次数
}
}
A柱上3个盘子打印。
A柱7个盘子打印。
总结:
这里我们是以某个盘子上的最后一个盘子,为参照,借助其中一个盘子,将最后一个盘子移动到目标盘子。代码中 hanoi函数 就是根据这个来传参的。
这里就是汉诺塔问题的详解。