`
wangxiaohigh
  • 浏览: 1458156 次
文章分类
社区版块
存档分类
最新评论

java汉诺塔测试

 
阅读更多
汉诺塔问题[又称河内塔]是印度的一个古老的传说。

据传开天辟地之神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。就是这看似简单的问题,却困扰了人们千年以上。

后来,这个传说就演变为汉诺塔游戏,玩法如下:

1.有三根杆子A,B,C。A杆上有若干碟子
2.每次移动一块碟子,小的只能叠在大的上面
3.把所有碟子从A杆全部移到C杆上

经过研究发现,三圆盘的汉诺塔问题很好破解,就是按照移动规则向一个方向移动金片:
如3阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C

但每当增加一阶,移动的次数却会以倍数增加,因此每当圆盘增加到一定数量时,常人只能望而却步。

而我们程序员却可以借助于计算机的运算性能,轻而易举地解决这一问题,汉诺塔问题也作为程序设计中的经典递归问题而存在下来。

但是,实践和理论往往却有天壤之别,我们虽然可以运算出汉诺塔的结果,但是却未必能动手完成这一结果。不信?我这里给出了一个简单的汉诺塔实现,有兴趣的可以自己码盘子看看。

packageorg.loon.test;

importjava.awt.Color;
importjava.awt.Dimension;
importjava.awt.Frame;
importjava.awt.Graphics;
importjava.awt.Menu;
importjava.awt.MenuBar;
importjava.awt.MenuItem;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.event.MouseAdapter;
importjava.awt.event.MouseEvent;
importjava.awt.event.WindowAdapter;
importjava.awt.event.WindowEvent;

/***//**
*<p>
*Title:LoonFramework
*</p>
*<p>
*Description:java汉诺塔测试
*</p>
*<p>
*Copyright:Copyright(c)2007
*</p>
*<p>
*Company:LoonFramework
*</p>
*
*
@authorchenpeng
*@email:ceponline@yahoo.com.cn
*
@version0.1
*/

publicclassHanioextendsFrame...{
/***//**
*
*/

privatestaticfinallongserialVersionUID=1L;

privateHanioDraw_hanioDraw;

publicstaticvoidmain(Stringargs[])...{
newHanio("java汉诺塔实现测试",350,300);
}


publicHanio(Stringstring,intwidth,intheight)...{
super(string);

_hanioDraw
=newHanioDraw();

setResizable(
false);//设为用户不可改变窗体大小
setSize(width,height);//设置窗口大小
setBackground(Color.WHITE);// 背景颜色设置为白色

//菜单
MenuBarmyMenu=newMenuBar();
MenusMenu
=newMenu("选择数量");

MenuItem[]mItems
=newMenuItem[6];
for(inti=3;i<=8;i++)...{
mItems[i
-3]=newMenuItem(String.valueOf(i));
mItems[i
-3].addActionListener(newActionListener()...{
publicvoidactionPerformed(ActionEvente)...{
_hanioDraw.init(Integer.parseInt(((MenuItem)e.getSource())
.getLabel().toString()));
repaint();
}

}
);
sMenu.add(mItems[i
-3]);
}


myMenu.add(sMenu);
setMenuBar(myMenu);

setLayout(
null);
//加入窗体监听
addWindowListener(newWindowAdapter()...{
publicvoidwindowClosing(WindowEvente)...{
System.exit(
0);
}

}
);
//加入鼠标监听
addMouseListener(newMouseAdapter()...{
publicvoidmouseClicked(MouseEvente)...{

Haniohanio
=(Hanio)e.getSource();
DimensionfrSize
=hanio.getSize();
intx=e.getX();
intw=frSize.width/3;
if(x<w)...{
hanio.getHanioDraw().click(
0);
}
elseif(x<(2*w))...{
hanio.getHanioDraw().click(
1);
}
else...{
hanio.getHanioDraw().click(
2);
}


hanio.repaint();

}

}
);
//窗体居中
setLocationRelativeTo(null);
//显示窗口
setVisible(true);

}


publicvoidpaint(Graphicsg)...{

finalintOBJECT_H=15;//对象高
finalintOBJECT_W=10;//对象宽
finalintOBJECT_D=90;//对象间距
finalintOBJECT_S=60;//起始位置

//绘制图像
intn;
for(n=0;n<8;n++)...{
if(_hanioDraw.getBlock(n,0)!=0)...{
g.drawRect(OBJECT_S,
200-n*OBJECT_H,OBJECT_W
*_hanioDraw.getBlock(n,0),OBJECT_H);
}

}

for(n=0;n<8;n++)...{
if(_hanioDraw.getBlock(n,1)!=0)...{
g.drawRect(OBJECT_D
+OBJECT_S,200-n*OBJECT_H,OBJECT_W
*_hanioDraw.getBlock(n,1),OBJECT_H);
}

}

for(n=0;n<8;n++)...{
if(_hanioDraw.getBlock(n,2)!=0)...{
g.drawRect(
2*OBJECT_D+OBJECT_S,200-n*OBJECT_H,
OBJECT_W
*_hanioDraw.getBlock(n,2),OBJECT_H);
}

}


if(_hanioDraw.getTop()!=0)...{
g.drawRect(
60,60,OBJECT_W*_hanioDraw.getTop(),OBJECT_H);
}

if(_hanioDraw.goFull())...{
g.drawString(
"完成",100,100);
}


}


publicHanioDrawgetHanioDraw()...{
return_hanioDraw;
}


publicvoidsetHanioDraw(HanioDrawhd)...{
this._hanioDraw=hd;
}


classHanioDraw...{

privateint_top;//拿起的方块

privateint_size;//总数

privateint[][]_room;//用以存储位置

privateint[]_cache;//缓存单个对象

publicHanioDraw()...{
_room
=newint[8][3];
_cache
=newint[3];
//默认初始值
init(3);
}


/***//**
*开始处理
*
*
@paramx
*/

publicvoidinit(intx)...{
_size
=x-1;
for(inti=0;i<=2;i++)...{
for(intj=0;j<8;j++)...{
_room[j][i]
=0;
}

_cache[i]
=-1;
}

for(inti=0;i<x;++i)...{
_room[i][
0]=x-i;
}

_cache[
0]=x-1;
_top
=0;
}


/***//**
*拿起目标对象
*
*
@paramx
*
@return
*/

booleantake(intx)...{
if(_cache[x]==-1)
returnfalse;
_top
=_room[_cache[x]][x];
_room[_cache[x]][x]
=0;
_cache[x]
--;
returntrue;
}


/***//**
*拖动目标对象
*
*
@paramx
*
@return
*/

booleandrop(intx)...{
if(_cache[x]!=-1)...{
if(_top>_room[_cache[x]][x])
returnfalse;
}

_cache[x]
++;
_room[_cache[x]][x]
=_top;
_top
=0;
returntrue;
}


/***//**
*判定事件是否完成
*
*
@return
*/

publicbooleangoFull()...{
if(_cache[1]==_size)...{
returntrue;
}

if(_cache[2]==_size)...{
returntrue;
}

returnfalse;
}


/***//**
*点击事件
*
*
@paramx
*
@return
*/

publicbooleanclick(intx)...{
if(goFull())...{
returnfalse;
}

if(_top==0)...{
take(x);
}
else...{
drop(x);
}

returntrue;
}


publicintgetTop()...{
return_top;
}


publicintgetBlock(intx,intgroup)...{
return_room[x][group];
}

}


}


运行图如下:



分享到:
评论

相关推荐

    JAVA 汉诺塔自动演示

    JAVA 汉诺塔自动演示是指使用JAVA编程语言实现汉诺塔问题的自动化演示程序。 在JAVA中实现汉诺塔自动演示,主要涉及以下几个知识点: 1. **递归**:汉诺塔问题的解决方案是基于递归算法的。递归函数通常包含两个...

    java 汉诺塔课程设计

    在这个Java课程设计中,我们将探讨如何利用Java语言来实现汉诺塔问题的解决方案。 汉诺塔问题的基本描述是:有三根柱子A、B、C,A柱上自下而上按大小顺序叠着n个盘子,目标是将所有盘子借助B和C柱,全部移到C柱上,...

    java版汉诺塔演示

    在Java编程中实现汉诺塔的演示程序,可以帮助理解递归算法和问题解决策略。下面将详细阐述这个Java版汉诺塔演示程序的相关知识点。 1. **汉诺塔问题描述** 汉诺塔问题由三根柱子(A、B、C)和若干个大小不一的圆盘...

    java汉诺塔源码

    下面我们将详细讲解Java实现汉诺塔的源码及其中涉及的知识点。 首先,我们需要创建一个方法来处理汉诺塔问题。这个方法通常接受三个参数:起始柱(source)、中间柱(auxiliary)和目标柱(destination)。在Java中...

    汉诺塔(java)

    总结来说,这个Java实现的汉诺塔游戏结合了基础的汉诺塔递归算法、GUI编程、颜色和大小的自定义、以及背景音乐播放等多方面技术。它不仅是一个教学示例,也是一个功能丰富的娱乐应用,展示了Java编程的广泛适用性和...

    自己用java做的汉诺塔

    在Java编程中实现汉诺塔游戏,我们可以深入理解递归算法、面向对象编程以及事件处理等方面的知识。以下是对这个项目的详细分析: 1. **递归算法**: 汉诺塔问题的核心在于递归解决策略。在Java中,我们可以通过...

    java汉诺塔小游戏程序源码

    通过这个Java汉诺塔小游戏源码,你可以深入理解递归算法的运用,以及如何在实际项目中实现逻辑复杂的游戏规则。同时,这也是一个练习面向对象编程、错误处理和用户交互的好机会。通过学习和分析这个源码,你将提升...

    java动态演示汉诺塔

    在这个Java实现中,我们使用了AWT(Abstract Window Toolkit)库来创建图形界面,动态地展示汉诺塔的搬运过程。以下是对这个程序涉及的知识点的详细解释: 1. **汉诺塔问题**:汉诺塔问题是一个典型的递归问题,由...

    汉诺塔游戏java源代码

    在Java编程中,实现汉诺塔游戏通常会涉及以下几个知识点: 1. **面向对象编程**:首先,你可以创建`Disk`类来表示圆盘,包含圆盘的大小(数字)和当前位置(柱子)。此外,`Tower`类可以用来表示柱子,存储和管理其...

    汉诺塔问题JAVA带实验报告

    在Java编程中解决汉诺塔问题,通常会使用递归函数来实现。这个过程可以分为三个基本步骤: 1. 将A柱上的n-1个圆盘借助B柱移动到C柱。 2. 将A柱剩下的最大圆盘直接移动到C柱。 3. 将B柱上的n-1个圆盘借助A柱移动到C...

    eclipse实现汉诺塔汉诺塔

    以下是一个基于Eclipse的Java汉诺塔实现的详细步骤和知识点: **1. 创建Java项目** 首先,在Eclipse中创建一个新的Java项目。点击"File" -&gt; "New" -&gt; "Java Project",输入项目名称,例如"汉诺塔",然后点击"Finish...

    汉诺塔模拟程序 汉诺塔模拟程序 汉诺塔模拟程序

    汉诺塔模拟程序是一种基于Java语言的编程任务,旨在帮助学生深入理解和应用数据结构、算法以及GUI设计。这个课程设计的主要目标是通过实现汉诺塔问题的解决方案,提高学生的编程技能,尤其是对Java语言的理解和实际...

    汉诺塔java课程设计

    汉诺塔游戏的解法可以用递归算法来表示,这也是一个很好的编程实践案例,尤其适用于学习Java编程的学生进行课程设计。 在Java平台上实现汉诺塔游戏,首先需要理解基础的面向对象编程概念,如类、对象、封装、继承和...

    汉诺塔_Java代码

    Java实现汉诺塔问题的算法通常基于递归。下面是一个简单的Java代码示例: ```java public class HanoiTower { public static void moveTower(int n, char fromRod, char toRod, char auxRod) { if (n &gt;= 1) { //...

    Java课程设计汉诺塔游戏代码及报告

    在这个Java课程设计中,我们将探讨如何利用Java语言来编写汉诺塔游戏的程序,并理解其背后的逻辑。 首先,我们要了解汉诺塔游戏的基本规则:三根柱子(A、B、C),柱子A上叠着一些盘子,数量不等,我们需要将所有...

    汉诺塔课程设计报告与源码

    汉诺塔游戏是一种经典的递归问题,源自印度的古老传说,它涉及到三个柱子和一组大小不一的圆盘。游戏的目标是将所有圆盘从第一个柱子(A)移动到第三个柱子(C),每次只能移动一个圆盘,并且任何时候大盘子都不能...

    汉诺塔代码(含有演示步骤)

    汉诺塔游戏是一种经典的逻辑谜题,源自印度的古老传说,目标是将所有盘子从一个柱子移动到另一个柱子,遵循以下规则: 1. 每次只能移动一个盘子。 2. 盘子不能被比它大的盘子压在上面。 在这个主题下,我们将探讨...

    汉诺塔.zip

    在这个“汉诺塔.zip”压缩包中,包含的源码是用Java编程语言实现的汉诺塔游戏的可视化程序。Java是一种广泛使用的面向对象的编程语言,以其跨平台性、高性能和丰富的类库而闻名。通过这个程序,用户不仅可以理解汉诺...

    经典问题 汉诺塔 的java课程设计

    汉诺塔(Hanoi Tower)是一个经典的递归问题,在计算机科学和数学领域有着...不过,上述内容已经涵盖了汉诺塔问题的解决思路以及Java课程设计的主要环节,希望对学习者理解汉诺塔问题和掌握Java课程设计流程有所帮助。

    Java语言编写的Hanoi图形演示程序(汉诺塔)

    汉诺塔(Hanoi)问题是一个经典的递归问题,它涉及到三个柱子和一堆不同大小的盘子。目标是将所有盘子从一个柱子移动到另一个柱子,每次只能移动一个盘子,并且任何时候大盘子都不能位于小盘子之上。Java语言可以很...

Global site tag (gtag.js) - Google Analytics