黑马程序员技术交流社区
标题:
编程:汉诺塔的java实现
[打印本页]
作者:
丶小天
时间:
2014-2-24 15:38
标题:
编程:汉诺塔的java实现
package com.wy.test;
/*
汉诺塔问题描述:
假设有三个命名为X(TOWER 1),Y(TOWER 2),Z(TOWER 3)的塔座,
在塔座X上有n个直径大小各不相同,依次从小到大编号为1,2,3,...,n的圆盘。
现要求将X塔座上的n个圆盘移到Z塔座上并按同样顺序叠排,
圆盘移动时必须遵循下列规则:
1)每次只能移动一个圆盘;
2)圆盘可以插在X,Y,Z中的任意塔座上;
3)任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。
*/
/*
解决思路:
我们先考虑最简单的情况,假如只有一个盘子,就直接从origin搬到目的地to。
如果两个盘子则是先把小盘子放assist,然后大盘子放to,最后再把assist里的盘子放destination。
假如有N个盘子时,我们可以这样想,底下最大的那个我们先不管(因为最大的如果你把它放那不动,
则可以无视它的,其他盘子可以在三个柱子上移来移去,它是最大嘛)。
于是我们可以先想办法把origin上的N-1个盘子搬到assist上,然后把最大的那个搬destination上,
最后再想办法把assist上的N-1个搬到destination上。于是当有盘子3个时,
先把上面2个搬到assist上,再把最大那个搬到destination,最后再想办法把assist上的2个搬destination上来。
*/
public class Hanoi {
/**
* @param n
* 盘子的数目
* @param origin
* 源座
* @param assist
* 辅助座
* @param destination
* 目的座
*/
public void hanoi(int n,char origin,char assist,char destination) {
if (n == 1) {
move(origin,destination);
} else {
hanoi(n - 1,origin,destination,assist);
move(origin,destination);
hanoi(n - 1,assist,origin,destination);
}
}
// Print the route of the movement
private void move(char origin,char destination) {
System.out.println("Direction:" + origin + "--->" + destination);
}
public static void main(String[] args) {
Hanoi hanoi = new Hanoi();
hanoi.hanoi(10,'A','B','C');
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2