游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。
操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。
递归思路:
此时我们已经具备了移动n=3个盘的“能力”
之后同理,n=4时可以将from柱子上n-1个盘移到mid柱子上
对应算法:
import java.util.Scanner;
public class Test_hanoi {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
if (N > 0) {
traverse(N, "left", "mid", "right");
}
}
/**
* 将from柱子上的n个柱子借助mid柱子移到to柱子上
*
* @param n from盘上有几个柱子
* @param from 一开始n个盘子都在这个柱子上
* @param mid 借住的柱子
* @param to 最终要移到的柱子
*/
public static void traverse(int n, String from, String mid, String to) {
if (n == 1) {
System.out.println("把" + from + "移到" + to);
} else {
//将from柱子上n-1个盘移到mid柱子上
traverse(n - 1, from, to, mid);
//将from柱子上剩下的最大的盘子直接移到to柱子上
//注意,这里是没有利用到mid盘的,尽管mid盘此时有n-1个盘子
traverse(1, from, mid, to);
//将mid柱子上n-1个盘子移到to盘上
traverse(n-1,mid,from,to);
}
}
}