import java.awt.*;
import java.awt.event.*;
public class hanota extends Frame implements ActionListener,TextListener,ItemListener //定义新的窗口类
{ static int n=1;                //初始化盘子的个数static int timect=19;       //演示的时间设置为中等static int ah=550;         //原柱,中间柱,目的柱的高度static int bh=550;        static int ch=550;       static hanota frm=new hanota();    //创建窗口对象static Label lab1=new Label("请输入盘子个数(1~10)"); static TextField txt1=new TextField(2);  //创建取得用户定义的盘子个数的文本区static Label lab2=new Label("演示速度");static Checkbox ckb1=new Checkbox("快");       //用户对演示的时间设置所使用的单选框static Checkbox ckb2=new Checkbox("中");static Checkbox ckb3=new Checkbox("慢");static Button btn1=new Button("演示");   //创建按钮static Button btn2=new Button("退出");static Button btn3=new Button("刷新");static Label lab[]=new Label[10];    //使用标签对象做盘子,最多10个盘public static void main(String args[])   { CheckboxGroup grp=new CheckboxGroup();  //创建单选框组btn1.addActionListener(frm);    //设置按钮的事件监听者为FRMbtn2.addActionListener(frm);btn3.addActionListener(frm);txt1.addTextListener(frm);     //设置文本的事件监听者为FRMckb1.setCheckboxGroup(grp);     //设置单选框的组grpckb2.setCheckboxGroup(grp);ckb3.setCheckboxGroup(grp);ckb1.addItemListener(frm);     //设置单选框的事件监听者为FRM    ckb2.addItemListener(frm);ckb3.addItemListener(frm);frm.setResizable(false);     //设置窗口不可改变大小frm.setLayout(null);frm.setTitle("汉诺塔问题的直观演示");frm.setSize(800,600);frm.setBackground(Color.pink);lab1.setBounds(20,560,150,15);    //初始所有标签,按钮,文本框,单选框的位置txt1.setBounds(170,560,20,15);lab2.setBounds(20,580,60,15);ckb1.setBounds(90,580,30,15);ckb2.setBounds(120,580,30,15);ckb3.setBounds(150,580,30,15);btn1.setBounds(340,560,120,30);btn2.setBounds(600,560,120,30);btn3.setBounds(340,560,120,30);frm.add(txt1);        //加载标签,按钮,文本框,单选框到窗口frm.add(lab1);frm.add(lab2);frm.add(btn1);frm.add(btn2);frm.add(btn3);frm.add(ckb1);frm.add(ckb2);frm.add(ckb3);frm.setVisible(true);      //设置各组件对象是否可见btn1.setVisible(false);btn3.setVisible(false);frm.addWindowListener(new WindowAdapter()  //设置窗口关闭按钮是可用{public void windowClosing(WindowEvent e){System.exit(0);}});}public void paint(Graphics g)     //绘制各个塔柱的位置{ g.drawLine(20,550,260,550);g.drawLine(140,50,140,550);g.drawLine(280,550,520,550);g.drawLine(400,50,400,550);g.drawLine(540,550,780,550);g.drawLine(660,50,660,550);}public void actionPerformed(ActionEvent e)      //设置按钮事件{ Button btn=(Button) e.getSource();if(btn==btn1)     //btn1为演示开始按钮{ for(int i=0;i<=n-1;i++)    //建立盘子对象并加载到窗口{ lab[i]=new Label();lab[i].setSize(24*(i+1),50);lab[i].setLocation(140-lab[i].getWidth()/2,550-lab[i].getHeight()*(n-i));lab[i].setBackground(Color.red);frm.add(lab[i]);}btn1.setVisible(false);for(double i=1;i<=Math.pow(10,6);i++);frm.hanoi(lab,n,140,400,660);    //汉诺塔演示的核心程序的调用btn3.setVisible(true);   //演示结束显示刷新按钮txt1.setVisible(false);   }if(btn==btn3)      //刷新,回到初始状态{  btn3.setVisible(false);btn1.setVisible(true);for(int i=0;i<=n-1;i++)frm.remove(lab[i]);txt1.setVisible(true);ah=550-50*n;bh=550;ch=550;}if(btn==btn2)     //退出System.exit(0);}public void textValueChanged(TextEvent e)    //的到用户指定的盘子的个数{ TextField txt=(TextField) e.getSource();if(txt==txt1){ try{n=Integer.parseInt(txt1.getText());}   //对输入的异常处理catch(NumberFormatException f){btn1.setVisible(false);return;} if(n>0&&n<=10)   //对输入的异常处理{ ah=550-50*n;btn1.setVisible(true);}elsebtn1.setVisible(false);      }}public void itemStateChanged(ItemEvent e)   //用户设置演示中盘子移动快慢{if(ckb1.getState()==true)timect=18;if(ckb2.getState()==true)timect=19;if(ckb3.getState()==true)timect=20;}public void settimectr(int timectc)   //移动的间隔时间{for(double h=1;h<=Math.pow(2,(double)timectc);h++);{Graphics m;m = this.getGraphics();m.setColor(Color.BLACK);paint(m);} }public void setactcolor(Label labl[],int ncl)  //盘子移动时的颜色,绿色{labl[ncl-1].setBackground(Color.green);}public void setcolorbak(Label labl[],int ncl) //盘子静止时的颜色,红色{labl[ncl-1].setBackground(Color.black);}public void hanoi(Label labc[],int nc,int xc,int yc,int zc)  //递归实现{ if(nc==1){setactcolor(labc,1);settimectr(timect);  move(labc,xc,1,zc);   //当只有一个盘子时直接从原柱移动到目的柱settimectr(timect);setcolorbak(labc,1);}else{       hanoi(labc,nc-1,xc,zc,yc);//当有N个盘子时,先把上面N-1个盘子移动到辅助的柱子上setactcolor(labc,nc);settimectr(timect);move(labc,xc,nc,zc);  //移动第N个盘子到目的柱settimectr(timect);setcolorbak(labc,nc);hanoi(labc,nc-1,yc,xc,zc);//把剩下的N-1个盘子从辅助的柱子移动到目的柱}}public void move(Label labb[],int xb,int nb,int zb)  //移动操作方法{ if(xb==140&&zb==660){labb[nb-1].setLocation(660-labb[nb-1].getWidth()/2,ch-50);ah=ah+50;ch=ch-50;}if(xb==140&&zb==400){labb[nb-1].setLocation(400-labb[nb-1].getWidth()/2,bh-50);ah=ah+50;bh=bh-50;}if(xb==400&&zb==660){labb[nb-1].setLocation(660-labb[nb-1].getWidth()/2,ch-50);bh=bh+50;ch=ch-50;}if(xb==400&&zb==140){labb[nb-1].setLocation(140-labb[nb-1].getWidth()/2,ah-50);ah=ah-50;}if(xb==660&&zb==400){labb[nb-1].setLocation(400-labb[nb-1].getWidth()/2,bh-50);ch=ch+50;bh=bh-50;}if(xb==660&&zb==140){labb[nb-1].setLocation(140-labb[nb-1].getWidth()/2,ah-50);ch=ch+50;ah=ah-50;}}
}

汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺相关推荐

  1. 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。

    import java.math.BigInteger; /* * 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具. 大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序 ...

  2. * 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。java

    大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘. 大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上(可以借助第三根柱子做缓冲). 并且规定, ...

  3. 汉诺塔c语言做法:汉诺塔(Hanoi)是必须用递归方法才能解决的经典问题。它来自于印度神话。上帝创造世界时作了三根金刚石柱子,在第一根柱子上从下往上按大小顺序摞着64片黄金圆盘

    汉诺塔(Hanoi)是必须用递归方法才能解决的经典问题.借助c杆将所有的圆盘移到b杆上,每次只能移一个,且小的盘子一定在大的盘子上面 它来自于印度神话.上帝创造世界时作了三根金刚石柱子,在第一根柱子上 ...

  4. 汉诺塔(Hanoi)是必须用递归方法才能解决的经典问题。它来自于印度神话。上帝创造世界时作了三根金刚石柱子,在第一根柱子上从下往上按大小顺序摞着64片黄金圆盘,如图7-3所示。

    汉诺塔(Hanoi)是必须用递归方法才能解决的经典问题.它来自于印度神话.上帝创造世界时作了三根金刚石柱子,在第一根柱子上从下往上按大小顺序摞着64片黄金圆盘,如图7-3所示.上帝命令婆罗门把圆盘从下 ...

  5. 汉诺塔递归调用(C语言实现)有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘

    什么是汉诺塔呢:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按 ...

  6. PTA汉诺(Hanoi)塔问题

    PTA汉诺(Hanoi)塔问题 古代某寺庙中有一个梵塔,塔内有3个座A.B和C,座A上放着64个大小不等的盘,其中大盘在下,小盘在上.有一个和尚想把这64 个盘从座A搬到座B,但一次只能搬一个盘,搬动 ...

  7. 汉诺塔(hanoi tower)游戏

    问题 递归实现汉诺塔 算法实现 #include <stdio.h> void hanoi( int n, char a, char b, char c) {if( n > 0 ) ...

  8. 3-6-汉诺塔(Hanoi Tower)问题-栈和队列-第3章-《数据结构》课本源码-严蔚敏吴伟民版...

    课本源码部分 第3章  栈和队列 - 汉诺塔(Hanoi Tower)问题 --<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接☛☛☛ <数据结构-C语言版> ...

  9. 汉诺(Hanoi)塔问题

    用C语言解决(Hanoi)汉诺塔问题 首先,我们先给出(Hanoi)汉诺塔问题: 相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏.该游戏是在一块铜板装置上,有三根杆(编号A.B.C),在A ...

最新文章

  1. 一次深夜优化,MySQL亿级数据分页的奇妙经历
  2. 高德地图区域线显示_护航国庆假期,助力重点区域精细化管理——扬州交警与高德地图联合推出“全境智能”系统...
  3. samtools idxstats
  4. .net 获取字符串中的第一个逗号的位置_SQLZOO中做错过的题
  5. vue如何获取年月日_好程序员web前端教程分享Vue相关面试题
  6. 监控利器--Cacti
  7. Java集合系列:Set解析
  8. 【linux】Grok Debugger本地安装过程
  9. onready怎么加img_用插件VMarker在vue中给图片加标记
  10. 转:MSSQL SERVER行转列 列转行
  11. 2020.12.28用isprime函数判断m是否为素数
  12. [线性代数] 1.3 n阶行列式
  13. win7定时关机命令_WIN7系统还有用吗?怎么随时切换WIN7/10?
  14. python如何登录一个需要第三方验证的网站_python+selenium 之如何跳过登录验证
  15. 火星人的耳机(Martian Headsets)
  16. 记录今天解决的一个poi的问题
  17. #7.白盒测试:控制流测试
  18. 【强化学习】确定性策略强化学习-DPGDDPG算法推导及分析
  19. N位加减法运算器实现(Verilog HDL)|计算机组成
  20. 用C++代码实现哔哩哔哩BV号转AV号

热门文章

  1. 简单的脚本在linux下将坚果云下同步的文件转移到zotero
  2. python随机生成小数_python如何生成随机小数
  3. 基于HFSS的环形定向耦合器设计实例
  4. 2003服务器硬盘陈列,Windows软阵列(磁盘阵列)视频教程
  5. 营销圈说:怎样制造胡歌被催婚上热搜的偶然?
  6. matlab中怎么判断一个pushbutton按钮是否按下,matlab的GUI 想问下 每个控件例如pushbutton的函数要怎么编写,函数与普通的m文件一样吗?...
  7. 要么读书,要么健身,要么恋爱(二)追风筝的人
  8. 用java代码打印一首诗
  9. 标定协议基础知识介绍
  10. PTP授时服务器(NTP网络时间服务器)技术方案应用