汉诺塔问题
2015-08-21 17:06
169 查看
moveDisks(int n, Tower origin, Tower destination, Tower buffer)
{
//终止条件
if (n <= 0) return;
/*将顶端n-1个盘子从origin移至buffer,
将destination用作缓冲区。*/
moveDisks(n - 1, origin, buffer, destination);
/*将origin顶端的盘子移至destination*/
moveTop(origin, destination);
/*将顶部n-1个盘子从buffer移至destination,
将origin用作缓冲区。*/
moveDisks(n - 1, buffer, destination, origin);
}
下面的代码给出了这个算法更详细的实现.
public static void main(String[] args) {
// TODO Auto-generated method stub
int n=3;
Tower[] towers=new Tower
;
for(int i=0;i<3;i++)
{
towers[i]=new Tower(i);
}
for(int i=n-1;i>=0;i--)
{
towers[0].add(i);
}
towers[0].moveDisks(n,towers[2],towers[1]);
}
public class Tower{
private Stack<Integer> disks;
private int index;
public Tower(int i)
{
disks=new Stack<Integer>();
index=i;
}
public int index()
{
return index;
}
public void add(int d)
{
if( !disks.isEmpty() && disks.peek() <= d )
{
System.out.println("Error placing disk"+d);
}
else
{
disks.push(d);
}
}
public void moveTopTo(Tower t)
{
int top=disks.pop();
t.add(top);
System.out.println("Move disk"+top+"from "+index()+"to"+t.index());
}
public void moveDisks(int n,Tower destination,Tower buffer)
{
if( n > 0 )
{
moveDisks(n-1,buffer,destination);
moveTopTo(destination);
buffer.moveDisks(n-1, destination, this);
}
}
}
严格来说,并不一定要将柱子实现为独立的对象。
相关文章推荐
- php文件上传
- Orchard编写网上商店模块2
- ANDROID定义自己的看法——onMeasure,MeasureSpec源代码 过程 思考具体解释
- 一个java实现的简单的4则运算器
- <img src="">标签中的src 找不到 Servlet的路径
- Apring中AOP使用
- 黑马程序员--转换流、打印流、序列化流、Properties类
- 【leetcode】House Robber I && II
- C++ new 之 placement new、operator new、new operator
- 虚方法
- Android UI设计:TextView与EditText
- 工作常用数据库SQL语句汇总
- 居然还有WM_TIMECHANGE(只在用户手动改变系统时间时才会产生作用)
- python爬虫1
- 友盟各个插件的使用方法
- c++ 四大函数练习
- 日期 12 小时制 24 小时制
- android 常见分辨率(mdpi、hdpi 、xhdpi、xxhdpi )及屏幕适配注意事项
- 线程6:互斥量,解决线程冲突
- CodeForces 6C - Alice, Bob and Chocolate