package endual;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int n = 2; //一共有多少个
char a = 'A' ; //开始的点
char b = 'B' ; //中间的点
char c = 'C' ; //结束的点
hanNoi(n,a,b,c) ;
}
/**
*
* 这个问题上有一个简单的解法。假设塔座上a, b, c排成一个三角形,a-->b-->-->a构成
* 一顺时针循环。在移动圆盘的过程中,若是奇数次移动,则将最小的圆盘移动到顺时针方向的
* 下一个底座上;若是偶数次的话,那么保存最小的圆盘不懂,而在其他两个塔座之间将
* 较小的圆盘移动到另个塔上去
*
*
* 其中,hanNoi(n,a,b,c)表示将塔座a上自下而上,由大到校叠在一起的n个圆盘依次移动
* 规则移动到塔座b上并扔按同样顺序叠放。在一定过程中,以塔座作为辅助塔座,
* move表示从a移动到b的方法
*
*
*/
private static void hanNoi(int n, char a, char b, char c) {
if (n == 1) {
//如果就剩下了,那么只有一种情况了,它要么移动到B,要么移动到C
//我们认为移动到C才是目标,因为如果移动到B和移动到C都是可行的
move (a, c) ;
return ;
}
//首先吧n-1个移动到b去
hanNoi(n-1,a,c,b) ; //将底盘最上面n-1个盘子从a移动到b去
move(a,c) ; //将底盘最下面一个从a移动到c中
hanNoi(n-1,b,a,c) ; //然后将n-1个盘子从b移动到c去,这样就完成了整个操作了
}
private static void move(char a, char c) {
System.out.println(a + "------------->" + c) ;
}
}