汉诺塔 java 程序

合集下载

汉诺塔游戏-----用C++编的

汉诺塔游戏-----用C++编的

#ifndef HANIO_H_#define HANIO_Hclass Stack{private:enum{ MAX=50 };int m_node[MAX];int m_top;int m_size;int m_index;public:Stack();~Stack() { };bool Isfull() { return m_top==MAX-1 ;}; //堆栈满则返回TRUE bool Isempty() { return m_top==-1;}; //堆栈空则返回TRUE int Top() { return m_top; };int TopValue() { return m_node[m_top];};int GetDataFromIndex(int i) { return m_node[i]; };int GetIndex() { return m_index; } ;void SetIndex(int index) { m_index = index; };int Size() { return m_top+1; };bool Push(int data);bool Pop(int * pData);int MoveToNext();void OutPrint();};class Hanio{Stack m_stack[3];int m_num; //盘数int m_steps; //移动次数int m_times; //完成所用时间void print(char ch,int n);public:Hanio(int num=3);~Hanio() {};void GameStart();bool MoveFromTo(int x,int y); //从x号盘移动到y号盘void DrawPaletes(char ch='*'); //打印3个堆的盘子bool IsFinished() ; //结束返回TURE;int Solve(char from,char to,char auxiliary,int n); //求解其解法路径};#endif//hanio.cpp#include "hanio.h"#include <iostream>#include<cstdlib>#include<cstring>#include<cctype>#include<windows.h>Stack::Stack(){m_top=-1;m_index=m_top;for(int i=0;i<MAX;i++)m_node[i]=0;}bool Stack::Push(int data){if(Isfull())return false;m_top++;m_node[m_top]=data;m_index=m_top;return true;}bool Stack::Pop(int *pData){if(Isempty())return false;*pData=m_node[m_top];m_node[m_top]=0;m_top--;m_index=m_top;return true;}int Stack::MoveToNext(){int temp=m_index;m_index--;return m_node[temp];}void Stack::OutPrint(){if(m_top!=-1){for(int i=0;i<=m_top;i++)std::cout<<"["<<m_node[i]<<"]";}}///////////////////////////////////////Hanio::Hanio(int num){m_num=num;m_steps=0;m_times=0;for(int i=num;i>=1;i--)m_stack[0].Push(i);//m_stack[0].OutPrint();}void Hanio::print(char ch,int n){for(int i=1;i<=n;i++)std::cout<<ch;}void Hanio::DrawPaletes(char ch){int max;max=m_stack[0].Size()>m_stack[1].Size() ? m_stack[0].Size() : m_stack[1].Size();max=m_stack[2].Size()>max ? m_stack[2].Size() : max;//std::cout<<"Max:"<<max<<std::endl;m_stack[0].SetIndex(max-1);m_stack[1].SetIndex(max-1);m_stack[2].SetIndex(max-1);for(int i=1;i<=max;i++){int data1=m_stack[0].MoveToNext();int data2=m_stack[1].MoveToNext();int data3=m_stack[2].MoveToNext();if(data1==0)print(' ',20);else{print(' ',10-data1);print(ch,2*data1);print(' ',10-data1);}if(data2==0)print(' ',20);else{print(' ',10-data2);print(ch,2*data2);print(' ',10-data2);}if(data3==0)print(' ',20);else{print(' ',10-data3);print(ch,2*data3);print(' ',10-data1);}std::cout<<std::endl;}}bool Hanio::MoveFromTo(int x,int y){m_steps++; //计算所走的步数if(m_stack[x].Isempty()){std::cout<<x<<" pallete is empty ! continue !"<<std::endl; std::cin.get();return false;}if(m_stack[y].Isempty()){int data;m_stack[x].Pop(&data);m_stack[y].Push(data);return true;}else{if(m_stack[x].TopValue()>m_stack[y].TopValue()){std::cout<<"The board can't move from "<<x<<" plate to " <<y<<" plate!"<<std::endl;std::cin.get();return false;}else{int data;m_stack[x].Pop(&data);m_stack[y].Push(data);return true;}}}bool Hanio::IsFinished(){return m_stack[2].Top()==m_num-1;}void Hanio::GameStart(){using namespace std;UINT StartTime=::GetTickCount();UINT EndTime;while(1){system("cls");print('-',80);cout<<"steps: "<<m_steps; print(' ',20);cout<<"Used time: "<<m_times<<endl;print('-',80);cout<<endl; cout<<endl; print(' ',10); cout<<"A";print(' ',19); cout<<"B"; print(' ',19);cout<<"C"<<endl<<endl;Hanio::DrawPaletes();cout<<endl; cout<<endl;print('-',80);//测试游戏是否结束if(Hanio::IsFinished()){cout<<"你好强呀!从今天开始,维护世界和平的任务就交给你那!"<<endl;cin.get();break;}//输入命令并左相应的处理char szCommand[50];cout<<">>";cin.getline(szCommand,50);if(stricmp(szCommand,"QUIT")==0 || stricmp(szCommand,"Q")==0)break;if(stricmp(szCommand,"HELP")==0 || stricmp(szCommand,"H")==0){cout<<" 本游戏说明:"<<endl;cout<<" 该游戏由DAVID用C++编程,花费了一个多下午的时间呢!!!,由命令行来控制铁饼的移动:"<<endl;cout<<" QUIT / Q : 退出程序"<<endl;cout<<" HELP / H : 查看该说明"<<endl;cout<<" XY : X,Y的取值为A,B,C,意思时把X木桩最上面的铁饼移到Y 木桩"<<endl;cout<<" SOLVE / S : 显示求解该问题(移动铁饼)的最优路径..."<<endl; cin.get();}char ch1=toupper(szCommand[0]);char ch2=toupper(szCommand[1]);if( ch1=='A' && ch2=='B')Hanio::MoveFromTo(0,1);else if ( ch1=='A' && ch2=='C')MoveFromTo(0,2);else if ( ch1=='B' && ch2=='A')MoveFromTo(1,0);else if ( ch1=='B' && ch2=='C')MoveFromTo(1,2);else if ( ch1=='C' && ch2=='A')MoveFromTo(2,0);else if ( ch1=='C' && ch2=='B')MoveFromTo(2,1);else{cout<<"Bad command !"<<endl;cin.get();}//统计游戏所用时间EndTime=GetTickCount();m_times=(EndTime-StartTime)/1000;}}int Hanio::Solve(char from,char to,char auxiliary,int n) {if(n==1)return 0;}//main.cpp#include<iostream>#include"hanio.h"#include<cstdlib>using namespace std;int StartPicture();//返回选择的盘数int main(){int number;number=StartPicture();Hanio hanio(number);hanio.GameStart();return 0;}void print(char ch,int n){for(int i=1;i<=n;i++)std::cout<<ch;}int StartPicture(){using namespace std;int number;system("cls");system("color fc");print(' ',20);print('-',25);cout<<endl;print(' ',20);cout<<" Hanio(汉诺塔)"<<endl;print(' ',20);print('-',25);cout<<endl;print(' ',40);print('-',5);cout<<"By David"<<endl;print('=',80);cout<<" 相传在某一座古庙中有3根木桩,有24个铁盘由小到大放置在一根木柱上,庙中流传者一个传说:\"如果能把24个铁盘, 从一根木桩移动到另一个木桩,且必须遵守如下规则:"<<endl;cout<<endl;print(' ',5);cout<<"1. 每天只能动一个盘,而且只能从最上面的铁盘开始搬动."<<endl; print(' ',5);cout<<"2. 必须维持较小的铁盘在上方的原则"<<endl;cout<<endl;cout<<"这两个原则,则当24个铁盘完全般到另一个木桩时,世界就回永久和平!!"<<endl;cout<<"游戏的玩法可以在命令行中输入HELP查看"<<endl;cout<<endl;cout<<endl;cout<<endl;cout<<endl;cout<<endl;cout<<"再此输入你要搬的铁盘数(建议在1--10值间,太多回花费很长时间的)"<<endl;print('=',80);cout<<">>";cin>>number;cin.get();system("cls");return number;}。

“汉诺塔”问题的算法分析及JAVA实现

“汉诺塔”问题的算法分析及JAVA实现
维普资讯
本 目 任 辑: 嫒 栏 贵编 谢 嫒
. . . 开 发研 究 与设 计技 术 . .. 。
‘ 诺塔 ’ ‘ 汉 ’ 的算法 分析及 J V 现 问题 A A' 实
张 宏 梅 ’鲁 邦 定 .
( . 苏通 州职 教 中心 江 苏 通 州 2 6 0 ;. 苏 电大 通 州学 院 江 苏 通 州 2 6 0 1江 2 30 2江 2 3 0)
盘 子的操作组成 的。用 H noN 1 ,,) a i 一 , A C调用递 归方法 , ( B 注意 : 这 里 是 借 助 于 A 塔 , N 1个 盘 子 从 B塔 移 动 到 C塔 , 将( — ) B是 源 塔 , ℃ 是 目标 塔 。 这个算法达 到了预期 的 目标 . 即在 C塔上按正确 的次序叠放 了所有 的圆形盘子。有 了前面问题 算j 去分析的基础 , 继而 , 我们可 以用 J V A A来实 现算法 。
h o g v . al k er e tru h l a c rma elan l bev lal h oec u ewhc ov sti iu + a  ̄o srece r tewh l o r ihs le hs s e y s s
K ywod : no A g rh Keus eJv e rsHai; loi m; crv ;aa t i
C塔 上 。 同样 , 一 步实 际 上 也 是 由 一 系 列更 小 的 符 合 规 则 的 移 动 这
2算 法分析
此 题 的 目的是 设 计 一 个 盘 子 移 动 的方 案 . 得 A 号 塔 上 的所 使 有 盘 子 借助 于 B号 塔 按 照 原 来 的 次 序 移 动 到 C号 塔 上 ,并 且 . 要 给 出完 整 的最 佳 的盘 子 移 动 的 方 案 。 我们从实 际的 、 体 的盘 子的移动 过程来分 析 . 出问 题 内 具 找 在 的 规 律 。经 分 析 无 论 盘 子 的 个 数 有 多 少 . 12、… …或 n个 . 是 、3 也 不 管 我 们 怎 么 去 移 动 盘 子 ( 然 是 按 规 则 来 移 动 )但 在 移 动 的 当 .

汉诺塔代码java实现

汉诺塔代码java实现

汉诺塔代码java实现汉诺塔(Tower of Hanoi)是一种经典的数学问题和递归算法示例。

这个问题的目标是将一堆盘子从一个柱子上移动到另一个柱子上,同时遵守以下规则:只能移动一个盘子,移动过程中不能将较大的盘子放在较小的盘子上。

以下是使用Java语言实现汉诺塔问题的代码示例:```javapublic class HanoiTower {public static void move(int n, char source, char target, char auxiliary) {if (n == 1) {System.out.println("Move disk 1 from " + source + " to " + target);return;}move(n - 1, source, auxiliary, target);System.out.println("Move disk " + n + " from " + source + " to " + target);move(n - 1, auxiliary, target, source);}public static void main(String[] args) {int n = 3; // 盘子的个数move(n, 'A', 'C', 'B');}}```在上述代码中,我们定义了一个名为`move`的递归函数,该函数接受四个参数:盘子的数量`n`、源柱子`source`、目标柱子`target`和辅助柱子`auxiliary`。

递归函数的作用是将`n`个盘子从源柱子移动到目标柱子。

当`n`等于1时,表示只有一个盘子需要移动,此时直接将该盘子从源柱子移动到目标柱子即可。

当`n`大于1时,我们需要先将`n-1`个盘子从源柱子移动到辅助柱子,然后将第`n`个盘子从源柱子移动到目标柱子,最后再将`n-1`个盘子从辅助柱子移动到目标柱子。

java实现汉诺塔详解及实现代码

java实现汉诺塔详解及实现代码

java实现汉诺塔详解及实现代码java 实现汉诺塔详解及实现代码汉诺塔问题:有三根柱⼦A,B,C,其中A上⾯有n个圆盘,从上⾄下圆盘逐渐增⼤,每次只能移动⼀个圆盘,并且规定⼤的圆盘不能叠放在⼩的圆盘上⾯,现在想要把A上⾯的n个圆盘全部都移动到C上⾯,输出移动的总步数以及移动的过程分析://先求出移动的总步数1,假设g(n)表⽰n个圆盘时的移动总的步数,当n=1时,g(1)=1;2.现在可以把g(n)进⾏细分为三步:1>先将n-1个圆盘从A通过C移动到B上⾯,相当于将n-1个圆盘从A移动到C,因此需要g(n-1)步;2>然后将剩下的最⼤的圆盘从A移动到C,需要1步;3>最后再将n-1个圆盘从B通过A移动到C上⾯,相当于将n-1个圆盘从A移动到C,因此也需要g(n-1)步;因此可以得出递归关系式:g(n) = 2*g(n-1)+1;//现在我们在来求出移动的过程1.假设hm(m,a,b,c)表⽰将m个圆盘从a通过b移动到c的过程,假设mv(a,c)输出⼀次a到c的过程,即print a-->c2.初始化hm,当m=1时,hm(1,a,b,c)=mv(a,c);2.可以把hm(m,a,b,c)进⾏细分为三步:1>先将n-1个圆盘从A通过C移动到B,此时b和c进⾏互换,也就是 hm(m-1,a,c,b);2>然后将剩下的最⼤的圆盘从A移动到C,也就是hm(1,a,b,c);3>最后将n-1个圆盘从B通过A移动到C,此时b和a进⾏交换,也就是 hm(m-1,b,a,c);最终得到过程的递归关系式:hm(m,a,b,c) = hm(m-1,a,c,b)+1+hm(m-1,b,a,c);实现代码:public class test{public static void main(String[] args){Scanner in = new Scanner(System.in);int n = in.nextInt();test t = new test();//获取总的步数System.out.println("需要移动的总步数为:" +t.getSum(n));//获取移动的过程t.hm(n,'a','b','c');}//获取总步数public int getSum(int n){if(n == 1)return 1;return 2 * getSum(n-1) +1 ;}//获取移动的过程public void hm(int m,char a,char b,char c){if(m == 1)move(a,c);hm(m-1,a,c,b);move(a,c);hm(m-1,b,a,c);}//输出⼀次移动的过程public void move(char a,char c){System.out.print(a + "-->" + c + " ");}}感谢阅读,希望能帮助到⼤家,谢谢⼤家对本站的⽀持!。

java递归算法经典题目

java递归算法经典题目

java递归算法经典题目递归是一种常见的算法思想,它通过将问题分解为更小的子问题来解决问题。

在Java中,递归算法可以用于解决许多经典问题,如斐波那契数列、汉诺塔、阶乘等。

下面我们将介绍一些Java递归算法经典题目,帮助您更好地理解和掌握递归算法。

1.斐波那契数列斐波那契数列是一个经典的递归问题,它是指从第0项开始,每一项都是前两项的和。

在Java中,可以使用递归方法来求解斐波那契数列。

以下是一个简单的递归算法实现:```javapublicstaticintfibonacci(intn){if(n<=1){returnn;}else{returnfibonacci(n-1)+fibonacci(n-2);}}```这个算法会一直递归调用直到达到斐波那契数列的末项为止。

需要注意的是,递归算法的时间复杂度较高,当n值较大时可能会导致栈溢出等问题。

2.汉诺塔问题汉诺塔问题是一个经典的递归问题,它描述了一个操作:将一堆盘子从一个柱子移动到另一个柱子,要求遵循以下规则:每次只能移动一个盘子,并且大盘子不能放在小盘子上面。

在Java中,可以使用递归方法来解决汉诺塔问题。

以下是一个简单的递归算法实现:```javapublicstaticvoidhanoi(intn,Stringfrom,Stringto,Stringvia) {if(n==1){System.out.println("Movedisk"+n+"from"+from+"to"+to);}else{hanoi(n-1,from,via,to);System.out.println("Movedisk1from"+from+"to"+to);hanoi(n-1,via,to,from);}}```这个算法会一直递归调用,直到完成所有盘子的移动。

汉诺塔问题

汉诺塔问题

汉诺塔百科名片汉诺塔初始状态汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。

上帝创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上安大小顺序摞着64片黄金圆盘。

上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。

并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

目录由来汉诺塔与宇宙寿命concreteHAM:汉诺塔问题的程序实现由来汉诺塔与宇宙寿命concreteHAM:汉诺塔问题的程序实现展开编辑本段由来来源汉诺塔是源自印度神话里的玩具。

上帝创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按大小顺序摞着64片黄金圆盘。

上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。

并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

传说在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。

印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。

不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。

僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。

不管这个传说的可信度有多大,如果考虑一下把64片金片,由一根针上移到另一根针上,并且始终保持上小下大的顺序。

这需要多少次移动呢?这里需要递归的方法。

假设有n片,移动次数是f(n).显然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1。

此后不难证明f(n)=2^n-1。

n=64时,f(64)= 2^64-1=18446744073709551615假如每秒钟一次,共需多长时间呢?一个平年365天有31536000 秒,闰年366天有31622400秒,平均每年31556952秒,计算一下,18446744073709551615/31556952=584554049253.855年这表明移完这些金片需要5845亿年以上,而地球存在至今不过45亿年,太阳系的预期寿命据说也就是数百亿年。

汉诺塔

汉诺塔

《JA V A语言程序设计》课程设计题目:汉诺塔随着计算机的普及越来越多得人使用计算机,人们得生活工作越来越离不开计算机!但是人们面对长时间的电脑工作,难免会有厌倦情绪,而现代人使用最多得打发无聊时间得方式,多是:聊天,浏览网页,看电影,玩大型得网游,结果到头来,花费勒很多得时间却发现自己并没有放松,相反还使自己更加精力疲倦!汉诺塔是一款益智小游戏,花费得时间不多,但是你却要经过思考来完成,从而获得身心得放松!关键词:汉诺塔;计算机;游戏;演示;移动1.引言 (1)1.1问题的提出 (1)1.2 任务设计内容 (1)2.需求分析 (2)2.1 界面及布局设计 (2)2.2 A、B、C 座的实现方法 (2)2.3 圆盘的实现方法 (3)2.4 记录时间方法 (3)3.总体设计 (4)3.1总体功能图 (4)3.2总体流程图 (5)4.主要功能设计流程 (6)4.1 A、B、C 座实现流程图 (6)4.2圆盘画法流程图 (7)4.3保存流程图 (7)4.4时间流程图 (8)5.代码实现 (8)5.1间关系图 (8)5.2 运行效果图 (9)6.总结与说明 (10)7.负责的部分原代码 (11)8.参考文献 (23)1.引言1.1问题的提出随着计算机得普及,人们越来越多得接触到计算机,人们得生活工作中无处不有计算机得身影!人们面对长时间的难免会有倦怠的情绪!而人们大多得缓解情绪得网络活动其实并不能起到放松心情得作用!现代人得生活节奏越来越快,有没有一种快速缓解疲倦得游戏呢?我们提出设计一款益智得小游戏,这种游戏不会花太多时间,同时把玩家得思维带动起来,达到一举多得得效果!1.2 任务设计内容(1)设计Hannoi塔中有三个座,名字分别是A、B和C。

初始状态是A座上有3个大小不等的盘子,这些盘子从座底到座顶按着大小顺序依次摆放在A 座上。

用户可以用鼠标选中盘子,然后通过拖动鼠标来移动该盘子、释放鼠标来放置该盘子;(2)程序要求用户在移动盘子过程中,不允许把大盘放置在小盘的上面,用户最终要完成的是把A座上的全部盘子移动到B座或C座上;(3)用户可以通过Hannoi塔界面提供的菜单来选择初级、中级、高级和自定义四个级别。

汉诺塔-经典递归算法(java描述)

汉诺塔-经典递归算法(java描述)

汉诺塔—经典递归算法(java描述)汉诺塔:(又称河内塔)问题是源于印度一个古老传说的益智玩具。

大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。

大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。

并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

整个算法要解决的是:将第一根柱子上的64个圆盘,借助第二根柱子,移到第三根柱子上,并确保小盘在大盘之上。

解决思路:(三根柱子设为X,Y,Z)1、先将前63个圆盘(看成一个圆盘)从X柱移到Y柱,确保大盘在小盘之下;(问题一)2、将第64个圆盘从X柱移到Z柱;3、再将前63个圆盘(看成一个圆盘)从Y柱移到Z柱,确保大盘在小盘之下。

(问题二)现在要解决:问题一:将X柱上的前63个圆盘,借助Z柱,移到Y柱上;问题二:将Y柱上的前63个圆盘,借助X柱,移到Z柱上;问题一的圆盘移动步骤:1、先将前62个圆盘,从X柱移到Z柱上;2、将第63个圆盘,从X柱移到Y柱上;3、在将前62个圆盘,从Z柱上移动到Y柱上。

问题二的圆盘移动步骤:1、先将前62个圆盘,从Y柱移到X柱;2、将第63个圆盘,从Y柱移到Z柱;3、再将前62个圆盘,从X柱移到Z柱。

从以上推导出推递归方法;问题一:1、先将前n-1个圆盘,从X柱移到Z柱;2、将第n个圆盘,从X柱移到Y柱;3、再将前n-1个圆盘,从Z柱移到Y柱。

问题二:1、先将前n-1个圆盘,从Y柱移到X柱;2、将第n个圆盘,从Y柱移到Z柱;3、再将前n-1个圆盘,从X柱移到Z柱。

主要代码思路(不能执行的):hanoi(n-1,’X’,’Z’,’Y’);//将X柱上的前n-1个圆盘,借助Z柱,移到Y柱上(问题一)move(n,’X’,’Z’);//将第n个圆盘,从X柱移到Z柱hanoi(n-1,’Y’,’X’,’Z’);//将Y柱上的前n-1个圆盘,借助X柱,移到Z柱上(问题二)递归的持续机制:当n>1时退出机制:当n=1时具体实现代码(java):import java.io.*;public class HanoiTowerDemo{public static void main(String[] args){try{BufferedReader br=new BufferedReader(new InputStreamReader(System.in));System.out.print("请输入汉诺塔总层数:");int n=Integer.parseInt(br.readLine());System.out.println("开始游戏,移动步骤是:");hanoi(n,'X','Y','Z');//将X柱上的n个圆盘,借助Y柱,移到Z柱}catch (Exception ex){}}/*功能:将X柱上的n个圆盘,借助Y柱,移到Z柱*/public static void hanoi(int n,char x,char y,char z){if(n==1)move(x,z); //将X柱上的圆盘移到Z柱上elseif(n>1){hanoi(n-1,x,z,y);//将X柱上的前n-1个圆盘,借助Z盘移到Y盘move(x,z);//将X柱上的圆盘移到Z柱上hanoi(n-1,y,x,z);//将Y柱上的前n-1个圆盘,借助X柱移到Z盘}}/*功能:将X柱上的圆盘移到Z柱上*/private static void move(char x,char z){System.out.println(x+" -> "+z);}}。

汉诺塔游戏java编程

汉诺塔游戏java编程

辽宁工业大学JA V A语言程序设计课程设计(论文)题目:汉诺塔游戏设计院(系):软件学院专业班级:计算机网络技术091班学号:091406015学生姓名:张铎赢指导教师:赵凯教师职称:讲师起止时间:2010.12.13至2010.12.24程序设计专题(报告)任务及评语目录第1章课程设计的目的与要求 (1)1.1 课程设计目的 (1)1.2 课程设计的实验环境 (1)1.3 课程设计的预备知识 (1)1.4 课程设计要求 (1)第2章课程设计内容 (2)2.1课程设计主要内容 (2)2.2概要设计 (2)2.2.1自定义类说明 (2)2.3详细设计 (3)2.4.1程序运行情况 (13)2.4.2程序异常处理 (16)第3章课程设计总结 (17)附录参考资料.................................................................第1章课程设计的目的与要求1.1 课程设计目的《JA V A程序设计》是计算机相关专业的必修专业基础课程,其实践性、应用性很强。

实践教学环节是必不可少的一个重要环节。

本课程的程序设计专题实际是计算机相关专业学生学习完《JA V A程序设计》课程后,进行的一次全面的综合训练,JA V A程序设计的设计目的是加深对理论教学内容的理解和掌握,使学生较系统地掌握程序设计及其在网络开发中的广泛应用,基本方法及技巧,为学生综合运用所学知识,利用软件工程为基础进行软件开发、并在实践应用方面打下一定基础。

1.2 课程设计的实验环境硬件要求能运行Windows 9.X操作系统的微机系统。

JA V A程序设计语言及相应的集成开发环境,J2SDK和ECLIPSE开发工具。

1.3 课程设计的预备知识熟悉JA V A语言及ECLIPSE开发工具。

1.4 课程设计要求按课程设计指导书提供的课题,要求学生在自行完成各个操作环节,并能实现且达到举一反三的目的,完成一个项目解决一类问题。

c语言汉诺塔问题递归算法

c语言汉诺塔问题递归算法

c语言汉诺塔问题递归算法汉诺塔问题是经典的递归问题,要求将n个大小不同的盘子从起始柱移动到目标柱,并遵循以下规则:1.大盘子不能在小盘子上方移动。

2.每次只能移动一个盘子。

在C语言中,我们可以使用递归算法来解决汉诺塔问题。

以下是一个简单的示例代码:```c#include<stdio.h>voidhanoi(intn,charfrom,charto,charaux){if(n==1){//只有一个盘子时,直接移动到目标柱printf("Movedisk1from%cto%c\n",from,to);}else{//递归地将n-1个盘子从起始柱移动到辅助柱,再将最后一个盘子从起始柱移动到目标柱hanoi(n-1,from,aux,to);printf("Movedisk%dfrom%cto%c\n",n,from,to);hanoi(n-1,aux,to,from);}}intmain(){intn;printf("Enterthenumberofdisks:");scanf("%d",&n);hanoi(n,'A','C','B');//从起始柱A开始,目标柱C,辅助柱Breturn0;}```在上述代码中,我们定义了一个名为hanoi的函数,用于实现汉诺塔问题的递归解法。

该函数接受四个参数:n表示盘子的数量,from表示起始柱,to表示目标柱,aux表示辅助柱。

当只有一个盘子时,直接移动到目标柱;否则,我们通过递归调用将n-1个盘子从起始柱移动到辅助柱,再将最后一个盘子从起始柱移动到目标柱。

在主函数中,我们从用户输入获取盘子的数量,并调用hanoi函数开始解决问题。

通过使用递归算法,我们可以将复杂的问题分解为更小的子问题,从而方便地解决问题。

在汉诺塔问题中,我们将n个盘子从起始柱移动到目标柱的问题分解为将n-1个盘子从起始柱移动到辅助柱和将最后一个盘子从起始柱移动到目标柱两个子问题。

汉诺塔java代码

汉诺塔java代码

汉诺塔java代码汉诺塔(Hanoi Tower)是经典的递归问题,它涉及到将一组圆盘从一个垂直柱子移动到另一个垂直柱子,中间通过第三个柱子。

这个问题可以通过递归的方式非常优雅地解决。

下面是使用Java编写的汉诺塔问题的代码,代码注释详细解释了每个步骤的含义。

```java/*** 汉诺塔问题的Java实现*/public class HanoiTower {/*** 汉诺塔问题的解决方法** @param n 圆盘的数量* @param from 起始柱子* @param to 目标柱子* @param aux 辅助柱子*/public static void solveHanoi(int n, char from, char to, char aux) {// 如果只有一个圆盘,直接移动到目标柱子if (n == 1) {System.out.println("移动圆盘 1 从柱子 " + from + " 到柱子 " + to);return;}// 将 n-1 个圆盘从起始柱子移动到辅助柱子,目标柱子作为辅助solveHanoi(n - 1, from, aux, to);// 移动第 n 个圆盘到目标柱子System.out.println("移动圆盘 " + n + " 从柱子 " + from + " 到柱子 " + to);// 将 n-1 个圆盘从辅助柱子移动到目标柱子,起始柱子作为辅助solveHanoi(n - 1, aux, to, from);}public static void main(String[] args) {// 圆盘的数量int numberOfDiscs = 3;// 调用解决方法solveHanoi(numberOfDiscs, 'A', 'C', 'B');}}```在这段Java代码中,我们使用了一个递归函数`solveHanoi`来解决汉诺塔问题。

四根柱子汉诺塔问题

四根柱子汉诺塔问题

Hanoi:为汉诺塔问题一、运行结果二、源程序import java.util.Scanner;/*** 问题描述:* 由原来的三根柱子,变为四根柱子,最终要把a柱子上的全部移到b柱子上** 思路分析:* 假设有n个圆盘,三根柱子,a,b,c,需要把n个盘子(从下往上按照大小顺序摞着)从a柱移动到b 柱,* 再找来了一根一模一样的柱子d,通过这个柱子来更快的把所有的盘子移到第三个柱子上。

* 这道题和之前都有很大的不同,加了一根柱子,意味着有的时候可用3根柱子,有的时候可用4根柱子, * 当把j个小盘子移动到d盘上时,有四根柱子可用,而当把n-j个盘子从a移动到b时,仅有三根柱子可用。

* 这里我们就要找到j的值,使所有移动的次数和最小。

** 解决方法:* 依然采用分治法。

* 首先把j个盘子移动到d柱子上(通过四个柱子可用的算法),需要B[j]次移动,* 然后把n-j个盘子移动到b柱子上(通过三个柱子可用的算法),需要A[n-j]次移动,* 然后把d中的j个盘子移动到b柱子上,需要B[j]次移动。

* 我们可以用j的大小循环,找到移动次数最小的j。

* 首先我们先计算移动的次数:* 核心公式为:count4(4柱子时总移动次数)=2*B[j]+A[i-j],即* j个盘子移动到第四个柱子,然后把剩下的i-j个在第四个不能用的情况下移到第三个** 补充:* 三根柱子时的次数计算* 假设移动n个盘子需要移动f(n)次,所以把n-1个盘子移动到b柱子上,需要移动f(n-1)次,* 然后把第n个盘子移动到c柱子上,需要移动1次,最后把n-1个盘子移动到c柱子上,需要移动f(n-1)次,* 综上所述,一共移动了f(n)=2f(n-1)+1次*/public class Hanoi {static int count = 0; //统计移动次数(可不需要,因为最少次数已经与n的值对应的记录在数组B中,即B[n])/*** 主函数*/public static void main(String[] args) {int n; //盘子数int flag_j; //记录找到的j的值int[] A = new int[65]; // 数组A:用来记录未加第四个柱子时候的移动次数情况int[] B = new int[65]; // 数组B:用来记录加了第四个柱子的情况/*根据三个柱子移动策略给数组A赋值(下面描述是按照将a柱上盘子移动到c柱上的问题来叙述的),即* 假设移动n个盘子需要移动f(n)次,所以把n-1个盘子移动到c柱子上,需要移动f(n-1)次,* 然后把第n个盘子移动到c柱子上,需要移动1次,* 最后把n-1个盘子移动到c柱子上,需要移动f(n-1)次,综上所述,一共移动了f(n)=2f(n-1)+1 次*/A[1] = 1; // 即三个柱子时,当i=1的时候,表示移动一个盘子,只需要移动一次for (int i = 2; i < 65; i++) {// 从i=2开始A[i] = 2 * A[i - 1] + 1; // f(n)=2f(n-1)+1}/** 将n个盘子分为两部分,即前j个和后n-j个* 且把前 j个用四个柱子的方法,后i-j个用三个柱子的方法* 下面主要是找到使移动次数最少的j值*/int count4; //记录四根柱子时,移动的总次数int min; //移动的最少次数,以用来和四个柱子时的其他情况进行比较int[] C = new int[65]; // 数组C:用来记录当前i下找到的的j值C[1] = 0; // 设置i=1时,初始值为0,即只有一个盘子时,令j=0C[2] = 0; // 设置i=2时,初始值为0,即只有两个盘子时,令j=0//注意:此时的i相当于盘子数nfor (int i = 3; i <= 64; i++) {min = A[i]; // 假设没加第四个柱子的结果次数为min的初值B[1] = 1; //可知 i=1 时,即一个盘子从柱子a->d,移动次数为1次B[2] = 3; //i=2时,即两个盘子从柱子a->d,移动次数为3次flag_j = 0;for (int j = 1; j < i; j++) {count4 = 2 * B[j] + A[i - j]; // j个移动到第四个柱子,然后把剩下的i-j个在第四个柱子不能用的情况下,移到第三个柱子/** 如果三根柱子时的次数min 大于四根柱子时的次数flag,则用flag更新min* 并记录下此时j的值,即得到了怎么分割盘子,才能使最终的移动次数最少*/if (min > count4) {min = count4;flag_j = j;}B[i] = min; // 将min赋给B[i],即四根柱子时,i个盘子从a->d 的次数C[i] = flag_j; // 找到了当前i下的j值}}Scanner scanner = new Scanner(System.in);while (true) {System.out.print("请输入一个n值(应为1-64之间的整数,输入0结束程序):");n = scanner.nextInt();if(n == 0) {System.out.println("ByeBye");break;}if(n > 64 || n < 1) {System.out.println("输入的n有误,请重新输入");continue;}char a = 'a', b = 'b', c = 'c', d = 'd';hanoi(n, a, b, c, d, C); // 把n个盘子从a柱子移动到b柱子System.out.println("共移动了: " + B[n] + " 次");System.out.println("共移动了: " + count + " 次");//与B[n]的值是一样的count = 0;//次数置零}}/*** 移动(使用四个柱子的移动方式)*/public static void hanoi(int n, char a, char b, char c, char d, int C[]){ int j = C[n]; //j个盘子使用四个柱子的移动方式if (n > 0) {hanoi(j, a, d, b, c, C);// 把j个盘子移动到d柱子上hanoi_basic_3(n - j, a, b, c);// 把n-j个盘子移动到b柱子上(使用三个柱子的移动方式)hanoi(j, d, b, a, c, C); // 把j个盘子移动到b柱子上}}/*** 把n-j个盘子移动到b柱子上(使用三个柱子的移动方式)*/public static void hanoi_basic_3(int n, char a, char c, char b){ if(n > 0) {hanoi_basic_3(n - 1, a, b, c);// 把n-1个盘子移动到c柱子上move(n, a, c); // 把a移动到chanoi_basic_3(n - 1, b, c, a); // 把第n个盘子移动到c柱子上 }}/*** 在控制台打印移动情况*/public static void move(int n, char a, char c){System.out.println(a + "->" + c);count++;//记录次数}}。

汉诺塔问题——精选推荐

汉诺塔问题——精选推荐

汉诺塔问题汉诺塔问题是⼀个经典的问题。

汉诺塔(Hanoi Tower),⼜称河内塔,源于印度⼀个古⽼传说。

⼤梵天创造世界的时候做了三根⾦刚⽯柱⼦,在⼀根柱⼦上从下往上按照⼤⼩顺序摞着64⽚黄⾦圆盘。

⼤梵天命令婆罗门把圆盘从下⾯开始按⼤⼩顺序重新摆放在另⼀根柱⼦上。

并且规定,任何时候,在⼩圆盘上都不能放⼤圆盘,且在三根柱⼦之间⼀次只能移动⼀个圆盘。

问应该如何操作?分析如果是初次接触类似的问题,乍看之下肯定会感觉⽆从下⼿。

要把64个圆盘从a柱⼦移动到c柱⼦上,第⼀步应该怎么做?虽然可以肯定,第⼀步唯⼀的选择是移动a最上⾯的那个圆盘,但是应该将其移到b还是c呢?很难确定。

因为接下来的第⼆步、第三步……直到最后⼀步,看起来都是很难确定的。

能⽴即确定的是最后⼀步:最后⼀步的盘⼦肯定也是a最上⾯那个圆盘,并且是由a或b移动到c——此前已经将63个圆盘移动到了c上。

也许你会说,管他呢,先随便试着移动⼀下好了。

如果你这么做,你会发现,接下来你会⾯临越来越多类似的选择,对每⼀个选择都“试”⼀下的话,你会偏离正确的道路越来越远,直到你发现你接下来⽆法进⾏为⽌。

如果将这个问题的盘⼦数量减为10个或更少,就不会有太⼤的问题了。

但盘⼦数量为64的话,你⼀共需要移动约1800亿亿步(18,446,744,073,709,551,615),才能最终完成整个过程。

这是⼀个天⽂数字,没有⼈能够在有⽣之年通过⼿动的⽅式来完成它。

即使借助于计算机,假设计算机每秒能够移动100万步,那么约需要18万亿秒,即58万年。

将计算机的速度再提⾼1000倍,即每秒10亿步,也需要584年才能够完成。

注:在我的笔记本电脑上,每秒⼤约能够移动6~8百万步。

虽然64个盘⼦超出了⼈⼒和现代计算机的能⼒,但⾄少对于计算机来说,这不是⼀个⽆法完成的任务,因为与我们⼈类不同,计算机的能⼒在不断提⾼。

分解问题⼀股脑地考虑每⼀步如何移动很困难,我们可以换个思路。

汉诺塔程序设计报告

汉诺塔程序设计报告

VC++作业电信学院电子0801班张海滨20809050汉诺塔程序设计报告一、题目汉诺塔(Towers of Hanoi)问题二、设计要求1、在窗口中画出初始时塔和碟子的状态。

2、可以以自动或手动两种方式搬移碟子。

3、自动搬移可以通过定时器或多线程的方法,每一次移动的时间间隔可以自定,以人眼观察比较舒服为宜,每一次的移动过程如能实现动画最好。

4、定义塔的描述类和碟子的描述类。

5、在程序中,碟子的数目及每次移动的时间间隔可以通过对话框设置(也应该有默认值)。

6、支持暂停功和继续的功能(在自动搬移过程中可以暂停,并继续)。

7、暂停后,可以将当前的状态保存(碟子和塔的组合关系)。

8、可以从7中保存的文件中读出某个状态,并继续移动。

三、问题分析1、已知有三个塔(1、2、3)和n个从大到小的金碟子,初始状态时n个碟子按从大到小的次序从塔1的底部堆放至顶部。

2、要求把碟子都移动到塔2(按从大到小的次序从塔2的底部堆放至顶部)。

3、每次移动一个碟子。

4、任何时候、任何一个塔上都不能把大碟子放到小碟子的上面。

5、可以借助塔3。

(图1-1)图1-1首先考虑a杆下面的盘子而非杆上最上面的盘子,于是任务变成了:1、将上面的63个盘子移到b杆上;2、将a杆上剩下的盘子移到c杆上;3、将b杆上的全部盘子移到c杆上。

将这个过程继续下去,就是要先完成移动63个盘子、62个盘子、61个盘子....1个盘的工作。

四、算法选择汉诺塔程序设计算法的实质就是递归递归思想的运用。

现将其算法简述如下:为了更清楚地描述算法,可以定义一个函数hanoi(n,a,b,c)。

该函数的功能是:将n个盘子从塔a上借助塔b移动到塔c上。

这样移动n 个盘子的工作就可以按照以下过程进行:1) hanoi(n-1,a,c,b);//将n-1个金盘由a借助c移到b2) 将最下面的金盘从a移动到c上;3) hanoi(n-1,b,a,c);//将b上的n-1个盘借助a移到c重复以上过程,直到将全部的盘子移动到塔c上时为止。

汉诺塔c语言程序代码

汉诺塔c语言程序代码

汉诺塔c语言程序代码(通过vc++6.0验证)(附讲解)让我们先看看代码吧#include <stdio.h>int hj(int a,int b, int c,int i){int t;if(i==1)printf("%d->%d\n",a,c);else{t=c;c=b;b=t;hj(a,b,c,i-1);printf("%d->%d\n",a,b);t=a;a=c;c=t;t=b;b=c;c=t;hj(a,b,c,i-1);return 0;}}main(){int a,b,c,i;a=1;b=2;c=3;printf("请输入汉诺塔的盘数");scanf("%d",&i);hj(a,b,c,i);return 0;}以上是汉诺塔的代码,该程序主要是运用了递归的思想,比如数学中的f(x)=f(x-1)+f(x-2),在本程序中为:int hj(int a,int b, int c,int i){int t;if(i==1)printf("%d->%d\n",a,c);else{t=c;c=b;b=t;hj(a,b,c,i-1);也就是说,我们在这个函数中再次调用这个函数,相当于一个循环,而在再次调用的过程中,i的值变成i-1,就类似于f(x-1),这样层层调用,最终就变成当i=1的时候的值,然后通过运算,计算出想要得到的值。

汉诺塔的数值分析:我们可以发现,当只有一个盘的时候,我们只需要做1->3(就是把第一个柱子上的最顶端的盘移动到第三根柱子,以下不再解释)当有两个盘的时候,是1->2 1->3 2->3三个盘子是:1->3 1->2 3->2 1->3 2->1 2->3 1->3分析一下可以得出以下结论:初始值a=1 b=2 c=3一个盘子就是a->c两个盘子与一个盘子的关系是:第一步:b与c交换值,然后打印a->c第二步:打印a->b第三步:a与c交换值,b与c交换值,打印a->c进一步分析,便可以得出以下结论只要盘子数量为i(i大于1),那么它就有三部分第一部分,b与c交换值,然后运行i-1第二部分,打印a->b第三部分,a与c交换值,b与c交换值,然后运行i-1程序表示便是:if(i==1)printf("%d->%d\n",a,c);else{t=c;c=b;(交换值)b=t;hj(a,b,c,i-1);printf("%d->%d\n",a,b);t=a;a=c;c=t;(a c交换)t=b;b=c;c=t;(b c交换)hj(a,b,c,i-1);。

汉诺塔问题的程序实现(hanoi塔)

汉诺塔问题的程序实现(hanoi塔)

汉诺塔问题的程序实现(hanoi塔)问题重述:有三根柱A、B、C,在柱A上有N块盘⽚,所有盘⽚都是⼤的在下⾯,⼩⽚能放在⼤⽚上⾯。

现要将A上的N块盘⽚移到C柱上,每次只能移动⼀⽚,⽽且在同⼀根柱⼦上必须保持上⾯的盘⽚⽐下⾯的盘⽚⼩,输⼊任意的N,输出移动⽅法。

(注意:这是⼀个古⽼的传说,传说是如果把64个盘⼦由A柱移到了C柱的话,那么世界末⽇就到了,事实上如果要把64个盘⼦从A柱移到C柱的话,即使⽤计算机运算,也要计算数亿年,所以这个预⾔未必不是真实。

)【分析】我们可以这样考虑,当n=1时,我们只要直接将A柱的盘⼦移到C柱,当n>1时,我们可以先把n-1个盘⼦由A柱通过C柱移到B 柱,此时就可以把A柱剩下的最后⼀个盘⼦直接移到C柱,这样接下来只要把n-1个盘⼦通过A柱移到C 柱即可,如果就构成了递归的思路,我们可以定义个移动过程mov(n,a,b,c)表⽰将n个盘⼦从a通过b移到c1.只要求输出搬运的次数#includeusing namespace std;int m=0;void move(){m++;}void I(int n){if(n==1)move();else{I(n-1);move();I(n-1);}}int main(){I(3);cout<cout<<"输出完毕!"<return 0;}更加简单的⽅法!#includeusing namespace std;int fact(int n){if(n==1)return(1);elsereturn((2*fact(n-1)+1));}int main(){cout<}2.不仅要求输出搬运的次数,⽽且要输出每个步骤的详细搬运#includeusing namespace std;int m=0;void Move(int n,char x,char y){cout<<"把"<m++;}void Hannoi(int n,char a,char b,char c){if(n==1)Move(1,a,c);else{Hannoi(n-1,a,c,b);Move(n,a,c);Hannoi(n-1,b,a,c);}}int main(){int i;cout<<"请输⼊圆盘数"<cin>>i;Hannoi(3,'a','b','c');cout<<"总的搬运次数"<cout<<"输出完毕!"<return 0;}}另外⼀种不利⽤递归的解法(很抱歉,我⾃⼰也没调出来,实在太复杂了)#includeusing namespace std;//圆盘的个数最多为64const int MAX = 1;//⽤来表⽰每根柱⼦的信息struct st{int s[MAX]; //柱⼦上的圆盘存储情况int top; //栈顶,⽤来最上⾯的圆盘char name; //柱⼦的名字,可以是A,B,C 中的⼀个int Top()//取栈顶元素{return s[top];}int Pop()//出栈{return s[top--];}void Push(int x)//⼊栈{s[++top] = x;}} ;long Pow(int x, int y); //计算x^yvoid Creat(st ta[], int n); //给结构数组设置初值void Hannuota(st ta[], long max); //移动汉诺塔的主要函数int main(void){int n;cin >> n; //输⼊圆盘的个数st ta[3]; //三根柱⼦的信息⽤结构数组存储Creat(ta, n); //给结构数组设置初值long max = Pow(2, n) - 1;//动的次数应等于2^n - 1 Hannuota(ta, max);//移动汉诺塔的主要函数system("pause");return 0;}void Creat(st ta[], int n){ta[0].name = 'A';ta[0].top = n-1;//把所有的圆盘按从⼤到⼩的顺序放在柱⼦A 上for (int i=0; ita[0].s[i] = n - i;//柱⼦B,C 上开始没有没有圆盘ta[1].top = ta[2].top = 0;for (int j=0; jta[1].s[j] = ta[2].s[j] = 0;//若n 为偶数,按顺时针⽅向依次摆放A B Cif (n%2 == 0){ta[1].name = 'B';ta[2].name = 'C';}else //若n 为奇数,按顺时针⽅向依次摆放A C B {ta[1].name = 'C';ta[2].name = 'B';}}long Pow(int x, int y){long sum = 1;for (int i=0; isum *= x;return sum;}void Hannuota(st ta[], long max){int k = 0; //累计移动的次数int i = 0;int ch;while (k < max){//按顺时针⽅向把圆盘1 从现在的柱⼦移动到下⼀根柱⼦ch = ta[i%3].Pop();ta[(i+1)%3].Push(ch);cout << ++k << ": " <<"Move disk " << ch << " from " << ta[i%3].name <<" to " << ta[(i+1)%3].name << endl;i++;//把另外两根柱⼦上可以移动的圆盘移动到新的柱⼦上if (k < max){ //把⾮空柱⼦上的圆盘移动到空柱⼦上,当两根柱⼦都为空时,移动较⼩的圆if (ta[(i+1)%3].Top() == 0 ||ta[(i-1)%3].Top() > 0 &&ta[(i+1)%3].Top() > ta[(i-1)%3].Top()){ch = ta[(i-1)%3].Pop();ta[(i+1)%3].Push(ch);cout << ++k << ": " << "Move disk "<< ch << " from " << ta[(i-1)%3].name<< " to " << ta[(i+1)%3].name << endl;}else{ch = ta[(i+1)%3].Pop();ta[(i-1)%3].Push(ch);cout << ++k << ": " << "Move disk " << ch << " from " << ta[(i+1)%3].name << " to " << ta[(i-1)%3].name << endl; }}}}补充知识:【典型例题1】求阶乘n!#includeusing namespace std;int fact(int n){if(n==0)return(1);elsereturn(n*fact(n-1)); }int main(){cout<。

项目2:玩一个文字汉诺塔

项目2:玩一个文字汉诺塔

玩一个文字汉诺塔1.1 知识准备(一)Android项目工程目录分析src文件夹:包含项目的所有包及源文件(.java)res文件夹:包含了项目中的所有资源,比如“drawable”(图像资源)、“layout”(布局文件)、“values”(常量)等。

gen文件夹:包含了关键的R.java文件,R.java是在建立项目时自动生成的,这个文件是只读模式的,不能更改,其是定义该项目所有资源的索引文件。

打开R文件,可以发现:这些常量的名字都与res文件夹中的文件名相同,证明R.java文件中所存储的是该项目所有资源的索引。

R文件会自动生成和更新。

AndroidManifest.xml文件:每个Android项目都必须拥有AndroidManefist,文件声明了本项目中所使用的Activity、Service和Receiver。

layout布局文件:定义了Activity的界面布局资源中的常量values:Strings.xml定义了项目中使用的字符串资源。

常量文件可以自由添加,比如可以添加colors.xml用来定义管理项目中使用的颜色资源。

Activity源代码:需要继承自Activity类,重写void onCreate(Bundle savedInstanceState)方法。

在onCreate方法中通过setContentView(yout.main)设置了Activi-ty要显示的布局文件(/layout/main.xml)。

(二)使用帧布局/框架布局设计界面框架布局(FrameLayout)是较为简单的界面布局之⼀,它在屏幕上开辟出了一块区域,在这块区域中可以添加多个子控件,但是所有的子控件都被对齐到屏幕的左上⾓角。

框架布局的⼤小由子控件中尺⼨最⼤的子控件来决定。

如果子控件一样大,同一时刻只能看到最上面的子控件。

1.2 职业素质框架布局常被⽤于实现图层的叠加效果,是⼗分灵活的一种布局。

微课-汉诺塔问题教案

微课-汉诺塔问题教案

本微课适用范围如下所示:课程所属学科:计算机适用专业:计算机应用技术、计算机软件工程、电子信息适用课程:C语言程序设计、C++程序设计、JAVA程序设计、数据结构适用对象:有一定编程基础的同学《汉诺塔问题》微课教案学院(部):软件学院系(教研室):网络教研授课教师:杨珺职称:副教授时间复杂度为:O(2n)程序实现部分汉诺塔问题的递归实现:#include<stdio.h>void hanoi(int n,char A,char B,char C){if(n==1){printf("Move disk %d from %c to %c\n",n,A,C);}else{hanoi(n-1,A,C,B);printf("Move disk %d from %c to %c\n",n,A,C);hanoi(n-1,B,A,C);}}main(){int n;printf("请输入数字n以解决n阶汉诺塔问题:\n");scanf("%d",&n);hanoi(n,'A','B','C');}●汉诺塔算法的非递归实现C++源代码#include <iostream>using namespace std;//圆盘的个数最多为64const int MAX = 64;//用来表示每根柱子的信息struct st{int s[MAX]; //柱子上的圆盘存储情况int top; //栈顶,用来最上面的圆盘char name; //柱子的名字,可以是A,B,C中的一个int Top()//取栈顶元素{return s[top];}int Pop()//出栈return s[top--];}void Push(int x)//入栈{s[++top] = x;}} ;long Pow(int x, int y); //计算x^yvoid Creat(st ta[], int n); //给结构数组设置初值void Hannuota(st ta[], long max); //移动汉诺塔的主要函数int main(void){int n;cin >> n; //输入圆盘的个数st ta[3]; //三根柱子的信息用结构数组存储Creat(ta, n); //给结构数组设置初值long max = Pow(2, n) - 1;//动的次数应等于2^n - 1 Hannuota(ta, max);//移动汉诺塔的主要函数system("pause");return 0;}void Creat(st ta[], int n){ta[0].name = 'A';ta[0].top = n-1;//把所有的圆盘按从大到小的顺序放在柱子A上for (int i=0; i<n; i++)ta[0].s[i] = n - i;//柱子B,C上开始没有没有圆盘ta[1].top = ta[2].top = 0;for (int i=0; i<n; i++)ta[1].s[i] = ta[2].s[i] = 0;//若n为偶数,按顺时针方向依次摆放 A B Cif (n%2 == 0){ta[1].name = 'B';ta[2].name = 'C';}else //若n为奇数,按顺时针方向依次摆放 A C Bta[1].name = 'C';ta[2].name = 'B';}}long Pow(int x, int y){long sum = 1;for (int i=0; i<y; i++)sum *= x;return sum;}void Hannuota(st ta[], long max){int k = 0; //累计移动的次数int i = 0;int ch;while (k < max){//按顺时针方向把圆盘1从现在的柱子移动到下一根柱子ch = ta[i%3].Pop();ta[(i+1)%3].Push(ch);cout << ++k << ": " <<"Move disk " << ch << " from " << ta[i%3].name <<" to " << ta[(i+1)%3].name << endl;i++;//把另外两根柱子上可以移动的圆盘移动到新的柱子上if (k < max){ //把非空柱子上的圆盘移动到空柱子上,当两根柱子都为空时,移动较小的圆盘if (ta[(i+1)%3].Top() == 0 ||ta[(i-1)%3].Top() > 0 &&ta[(i+1)%3].Top() > ta[(i-1)%3].Top()){ch = ta[(i-1)%3].Pop();ta[(i+1)%3].Push(ch);cout << ++k << ": " << "Move disk "<< ch << " from " << ta[(i-1)%3].name<< " to " << ta[(i+1)%3].name << endl;}else{ch = ta[(i+1)%3].Pop();ta[(i-1)%3].Push(ch);cout << ++k << ": " << "Move disk "<< ch << " from " << ta[(i+1)%3].name<< " to " << ta[(i-1)%3].name << endl;}}}}汉诺塔问题的非递归实现#include <stdio.h>#include <math.h>#include <stdlib.h>//第0位置是柱子上的塔盘数目int zhua[100]={0},zhub[100]={0},zhuc[100]={0};char charis(char x,int n)//左右字符出现顺序固定,且根据n值奇偶而不同{switch(x){case 'A':return (n%2==0)?'C':'B';case 'B':return (n%2==0)?'A':'C';case 'C':return (n%2==0)?'B':'A';default:return '0';}}void print(char lch,char rch)//打印字符{if(lch=='A'){switch(rch){case 'B':zhub[0]++;zhub[zhub[0]]=zhua[zhua[0]]; zhua[zhua[0]]=0;zhua[0]--;break;case 'C':zhuc[0]++;zhuc[zhuc[0]]=zhua[zhua[0]]; zhua[zhua[0]]=0;zhua[0]--;break;default:break;}}if(lch=='B'){switch(rch){case 'A':zhua[0]++;zhua[zhua[0]]=zhub[zhub[0]]; zhub[zhub[0]]=0;zhub[0]--;break;case 'C':zhuc[0]++;zhuc[zhuc[0]]=zhub[zhub[0]]; zhub[zhub[0]]=0;zhub[0]--;break;default:break;}}if(lch=='C'){switch(rch){case 'A':zhua[0]++;zhua[zhua[0]]=zhuc[zhuc[0]];zhuc[zhuc[0]]=0;zhuc[0]--;break;case 'B':zhub[0]++;zhub[zhub[0]]=zhuc[zhuc[0]];zhuc[zhuc[0]]=0;zhuc[0]--;break;default:break;}}printf("\t");int i;printf("(");for(i=1;i<=zhua[0];i++)printf(" %d ",zhua[i]);printf(")");printf("(");for(i=1;i<=zhub[0];i++)printf(" %d ",zhub[i]);printf(")");printf("(");for(i=1;i<=zhuc[0];i++)printf(" %d ",zhuc[i]);printf(")");printf("\n");}void Hannuo(int n){//分配2^n个空间bool *isrev;isrev=(bool *)malloc(sizeof(bool)*(int)pow(2,n)); for(int i=1;i<pow(2,n);i++)//循环计算是否逆序for(int ci=2;ci<=n;ci++){for(int zixh=(int)pow(2,ci-1);zixh<pow(2,ci);zixh+=4) //初始值重复一次,自增值可加4,减少循环次数。

汉诺塔

汉诺塔

package Mine;import java.awt.Button;import java.awt.Color;import java.awt.Container;import java.awt.Dimension;import java.awt.Graphics;import bel;import java.awt.Panel;import java.awt.TextField;import java.awt.Toolkit;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.text.AbstractDocument.Content;public class Myhnt extends JFrame {int WIDTh=800,HEIGHT=600;TextField number;int boxNumber=0;Box[] boxA=new Box[10],boxB=new Box[10],boxC=new Box[10];Container page=this.getContentPane();public void paintBox(Graphics g){g.setColor(Color.red);for(int i=0;i<boxNumber;i++){if(boxA[i]!=null){g.fill3DRect(150-boxA[i].getWidth()/2,500-(i+1)*10,boxA[i].getWidth(),boxA[i].getHeight( ), false);}if(boxB[i]!=null){g.fill3DRect(400-boxB[i].getWidth()/2,500-(i+1)*10,boxB[i].getWidth(),boxB[i].getHeight(), false);}if(boxC[i]!=null){g.fill3DRect(650-boxC[i].getWidth()/2,500-(i+1)*10,boxC[i].getWidth(),boxC[i].getHeight(),false);}//g.fill3DRect(150-(150-i*15)/2,500-(i+1)*10,150-i*15, 10, false);}}public void setBoxNumber(int num){this.boxNumber=num;for(int i=0;i<num;i++){Box box=new Box();box.setWidth(150-15*i);boxA[i]=box;}}JPanel panel=new JPanel(){public void paint(Graphics g){paintBackground(g);paintBox(g);}};public void paintBackground(Graphics g){g.setColor(Color.black);g.fill3DRect(0,0,800,600,false);g.setColor(Color.blue);for(int i=0;i<3;i++){g.fill3DRect(50*(i+1)+i*200, 500, 200, 5, false);g.fill3DRect(50*(i+1)+i*200+98, 300, 5, 200, false);}}private class ThreadRun implements Runnable{public void move(Box[] a,Box[] b){try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}if(a==boxA){if(b==boxB) System.out.println("A-->B");else System.out.println("A-->C");}else if(a==boxB){if(b==boxA)System.out.println("B-->A");else System.out.println("B-->C");}else if(a==boxC){if(b==boxA) System.out.println("C-->A");else System.out.println("C-->B");}int i=0;Box box = null;while(a[i]!=null){if(a[i+1]==null){box=a[i];a[i]=null;}else i++;}int j=0;while(b[j]!=null){j++;}b[j]=box;repaint();}public void hanoi(int n,Box[] a,Box[] b,Box[] c){if(n==1) move(a,c);else{hanoi(n-1,a,c,b);move(a,c);hanoi(n-1,b,a,c);}}public void run() {hanoi(boxNumber,boxA,boxB,boxC);}}public void setBoxDefault(){boxA=new Box[10];boxB=new Box[10];boxC=new Box[10];}public Myhnt(){super("汉诺塔");Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();int screenWidth=screenSize.width;int screenHeight=screenSize.height;this.setSize(WIDTh,HEIGHT);//this.setForeground(Color.black);//设置无效,被contentPane挡住。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

汉诺塔java 程序import java.awt.*;import java.awt.event.*;import javax.swing.*;public class AutoMoveDisc extends JDialog implements ActionListener{ int amountOfDisc=3;TowerPoint [] pointA,pointB,pointC;char [] towerName;Container con;StringBuffer moveStep;JTextArea showStep;JButton bStart,bStop,bContinue,bClose;Timer time;int i=0,number=0;AutoMoveDisc(Container con){setModal(true);setTitle("自动演示搬盘子过程");this.con=con;moveStep=new StringBuffer();time=new Timer(1000,this);time.setInitialDelay(10);showStep=new JTextArea(10,12);bStart=new JButton("演示");bStop=new JButton("暂停");bContinue=new JButton("继续");bClose=new JButton("关闭");bStart.addActionListener(this);bStop.addActionListener(this);bContinue.addActionListener(this);bClose.addActionListener(this);JPanel south=new JPanel();south.setLayout(new FlowLayout());south.add(bStart);south.add(bStop);south.add(bContinue);south.add(bClose);add(new JScrollPane(showStep),BorderLayout.CENTER);add(south,BorderLayout.SOUTH);setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);towerName=new char[3];addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e){time.stop();setVisible(false);}});}public void setPointA(TowerPoint [] pointA){this.pointA=pointA;}public void setPointB(TowerPoint [] pointB){this.pointB=pointB;}public void setPointC(TowerPoint [] pointC){this.pointC=pointC;}public void setTowerName(char name[]){if(name[0]==name[1]||name[0]==name[2]||name[1]==name[2]){towerName[0]='A';towerName[1]='B';towerName[2]='C';}elsetowerName=name;}public void setAmountOfDisc(int n){amountOfDisc=n;}public void actionPerformed(ActionEvent e) {if(e.getSource()==time){number++;char cStart,cEnd;if(i<=moveStep.length()-2){cStart=moveStep.charAt(i);cEnd=moveStep.charAt(i+1);showStep.append("("+number+")从"+cStart+"座搬一个盘子到"+cEnd+"座\n");autoMoveDisc(cStart,cEnd);}i=i+2;if(i>=moveStep.length()-1){time.stop();}}else if(e.getSource()==bStart){if(moveStep.length()==0){if(time.isRunning()==false){i=0;moveStep=new StringBuffer();setMoveStep(amountOfDisc,towerName[0],towerName[1],towerName[2]);number=0;time.start();}}}else if(e.getSource()==bStop){if(time.isRunning()==true)time.stop();}else if(e.getSource()==bContinue){if(time.isRunning()==false)time.restart();}else if(e.getSource()==bClose){time.stop();setVisible(false);}}private void setMoveStep(int amountOfDisc,char one,char two,char three){ if(amountOfDisc==1){moveStep.append(one);moveStep.append(three);}else{setMoveStep(amountOfDisc-1,one,three,two);moveStep.append(one);moveStep.append(three);setMoveStep(amountOfDisc-1,two,one,three);}}private void autoMoveDisc(char cStart,char cEnd){Disc disc=null;if(cStart==towerName[0]){for(int i=0;i<pointA.length;i++){if(pointA[i].isHaveDisc()==true){disc=pointA[i].getDiscOnPoint();pointA[i].setHaveDisc(false);break;}}}if(cStart==towerName[1]){for(int i=0;i<pointB.length;i++){if(pointB[i].isHaveDisc()==true){disc=pointB[i].getDiscOnPoint();pointB[i].setHaveDisc(false);break;}}}if(cStart==towerName[2]){for(int i=0;i<pointC.length;i++){if(pointC[i].isHaveDisc()==true){disc=pointC[i].getDiscOnPoint();pointC[i].setHaveDisc(false);break;}}}TowerPoint endPoint=null;int i=0;if(cEnd==towerName[0]){for(i=0;i<pointA.length;i++){if(pointA[i].isHaveDisc()==true){if(i>0){endPoint=pointA[i-1];break;}else if(i==0)break;}}if(i==pointA.length)endPoint=pointA[pointA.length-1];}if(cEnd==towerName[1]){for(i=0;i<pointB.length;i++){if(pointB[i].isHaveDisc()==true){if(i>0){endPoint=pointB[i-1];break;}else if(i==0)break;}}if(i==pointB.length)endPoint=pointB[pointB.length-1];}if(cEnd==towerName[2]){for(i=0;i<pointC.length;i++){if(pointC[i].isHaveDisc()==true){if(i>0){endPoint=pointC[i-1];break;}else if(i==0)break;}}if(i==pointC.length)endPoint=pointC[pointC.length-1];}if(endPoint!=null&&disc!=null){endPoint.putDisc(disc,con);endPoint.setHaveDisc(true);}}}import javax.swing.*;import java.awt.*;public class Disc extends JButton{int number;TowerPoint point;Disc(){setBackground(Color.cyan);}public void setNumber(int n){number=n;}public int getNumber(){return number;}public void setPoint(TowerPoint p){point=p;}public TowerPoint getPoint(){return point;}}import java.awt.event.*;import java.awt.*;public class HandleMouse implements MouseListener,MouseMotionListener { TowerPoint [] pointA,pointB,pointC;TowerPoint startPoint=null,endPoint=null;int leftX,leftY,x0,y0;boolean move=false,countTime=false;Container con;HandleMouse(Container con){this.con=con;}public void setPointA(TowerPoint [] pointA){this.pointA=pointA;}public void setPointB(TowerPoint [] pointB){this.pointB=pointB;}public void setPointC(TowerPoint [] pointC){this.pointC=pointC;}public void mousePressed(MouseEvent e){move=false;Disc disc=null;disc=(Disc)e.getSource();startPoint=disc.getPoint();x0=e.getX();y0=e.getY();int m=0;for(int i=0;i<pointA.length;i++){if(pointA[i].equals(startPoint)){m=i;if(m>0&&(pointA[m-1].isHaveDisc()==false)){move=true;break;}else if(m==0){move=true;break;}}}for(int i=0;i<pointB.length;i++){if(pointB[i].equals(startPoint)){m=i;if(m>0&&(pointB[m-1].isHaveDisc()==false)){move=true;break;}else if(m==0){move=true;break;}}}for(int i=0;i<pointC.length;i++){if(pointC[i].equals(startPoint)){m=i;if(m>0&&(pointC[m-1].isHaveDisc()==false)){move=true;break;}else if(m==0){move=true;break;}}}}public void mouseMoved(MouseEvent e){}public void mouseDragged(MouseEvent e){Disc disc=null;disc=(Disc)e.getSource();leftX=disc.getBounds().x;leftY=disc.getBounds().y;int x=e.getX();int y=e.getY();leftX=leftX+x;leftY=leftY+y;if(move==true)disc.setLocation(leftX-x0,leftY-y0);}public void mouseReleased(MouseEvent e){Disc disc=null;disc=(Disc)e.getSource();Rectangle rect=disc.getBounds();boolean location=false;int x=-1,y=-1;for(int i=0;i<pointA.length;i++){x=pointA[i].getX();y=pointA[i].getY();if(rect.contains(x,y)){endPoint=pointA[i];if(i==pointA.length-1&&endPoint.isHaveDisc()==false){location=true;break;}else if(i<pointA.length-1&&pointA[i+1].isHaveDisc()==true&&endPoint.isHaveDisc()==false&&pointA[i+1].getDiscOnPoint().getNumber()>disc.getNumber()){location=true;break;}}}for(int i=0;i<pointB.length;i++){x=pointB[i].getX();y=pointB[i].getY();if(rect.contains(x,y)){endPoint=pointB[i];if(i==pointB.length-1&&endPoint.isHaveDisc()==false){location=true;break;}else if(i<pointB.length-1&&pointB[i+1].isHaveDisc()==true&&endPoint.isHaveDisc()==false&&pointB[i+1].getDiscOnPoint().getNumber()>disc.getNumber()){location=true;break;}}}for(int i=0;i<pointC.length;i++){x=pointC[i].getX();y=pointC[i].getY();if(rect.contains(x,y)){endPoint=pointC[i];if(i==pointC.length-1&&endPoint.isHaveDisc()==false){location=true;break;}else if(i<pointC.length-1&&pointC[i+1].isHaveDisc()==true&&endPoint.isHaveDisc()==false&&pointC[i+1].getDiscOnPoint().getNumber()>disc.getNumber()){location=true;break;}}}if(endPoint!=null&&location==true){endPoint.putDisc(disc,con);startPoint.setHaveDisc(false);}elsestartPoint.putDisc(disc,con);}public void mouseEntered(MouseEvent e){}public void mouseExited(MouseEvent e){}public void mouseClicked(MouseEvent e){}}import javax.swing.*;import java.awt.*;import java.awt.event.*;public class HannoiWindow extends JFrame implements ActionListener{ Tower tower=null;int amountOfDisc=3;char []towerName={'A','B','C'};JMenuBar bar;JMenu menuGrade;JMenuItem oneGradeItem,twoGradeItem,threeGradeItem;JButton renew=null;JButton autoButton=null;JPanel center=new JPanel();HannoiWindow(){tower=new Tower(towerName);tower.setAmountOfDisc(amountOfDisc);tower.setMaxDiscWidth(120);tower.setMinDiscWidth(50);tower.setDiscHeight(16);tower.putDiscOnTower();add(tower,BorderLayout.CENTER);bar=new JMenuBar();menuGrade=new JMenu("选择级别");oneGradeItem=new JMenuItem("初级");twoGradeItem=new JMenuItem("中级");threeGradeItem=new JMenuItem("高级");menuGrade.add(oneGradeItem);menuGrade.add(twoGradeItem);menuGrade.add(threeGradeItem);bar.add(menuGrade);setJMenuBar(bar);oneGradeItem.addActionListener(this);twoGradeItem.addActionListener(this);threeGradeItem.addActionListener(this);renew=new JButton("重新开始");renew.addActionListener(this);autoButton=new JButton("自动演示");autoButton.addActionListener(this);JPanel north=new JPanel();north.add(renew);north.add(autoButton);String mess="将全部盘子从"+towerName[0]+"座搬运到"+towerName[1]+ "座或"+towerName[2]+"座";JLabel hintMess=new JLabel(mess,JLabel.CENTER);north.add(hintMess);add(north,BorderLayout.NORTH);setResizable(false);setVisible(true);setBounds(60,60,460,410);validate();setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}public void actionPerformed(ActionEvent e){if(e.getSource()==oneGradeItem){amountOfDisc=3;tower.setAmountOfDisc(amountOfDisc);tower.putDiscOnTower();}else if(e.getSource()==twoGradeItem){amountOfDisc=4;tower.setAmountOfDisc(amountOfDisc);tower.putDiscOnTower();}else if(e.getSource()==threeGradeItem){amountOfDisc=5;tower.setAmountOfDisc(amountOfDisc);tower.putDiscOnTower();}else if(e.getSource()==renew){tower.setAmountOfDisc(amountOfDisc);tower.putDiscOnTower();}else if(e.getSource()==autoButton){tower.setAmountOfDisc(amountOfDisc);tower.putDiscOnTower();int x=this.getBounds().x+this.getBounds().width;int y=this.getBounds().y;tower.getAutoMoveDisc().setLocation(x,y);tower.getAutoMoveDisc().setSize(280,this.getBounds().height);tower.getAutoMoveDisc().setVisible(true);}validate();}public static void main(String args[]){new HannoiWindow();}}import javax.swing.*;import java.awt.*;public class Tower extends JPanel{int amountOfDisc=3;Disc [] disc;int maxDiscWidth,minDiscWidth,discHeight;char [] towerName;TowerPoint [] pointA,pointB,pointC;HandleMouse handleMouse;AutoMoveDisc autoMoveDisc;Tower(char [] towerName){handleMouse=new HandleMouse(this);this.towerName=towerName;setLayout(null);setBackground(new Color(200,226,226));}public void setAmountOfDisc(int number){if(number<=1)amountOfDisc=1;elseamountOfDisc=number;}public void setMaxDiscWidth(int m){maxDiscWidth=m;}public void setMinDiscWidth(int m){minDiscWidth=m;}public void setDiscHeight(int h){discHeight=h;}public AutoMoveDisc getAutoMoveDisc(){return autoMoveDisc;}public void putDiscOnTower(){removeDisk();int n=(maxDiscWidth-minDiscWidth)/amountOfDisc;disc=new Disc[amountOfDisc];for(int i=0;i<disc.length;i++){disc[i]=new Disc();disc[i].setNumber(i);int diskwidth=minDiscWidth+i*n;disc[i].setSize(diskwidth,discHeight);disc[i].addMouseListener(handleMouse);disc[i].addMouseMotionListener(handleMouse);}pointA=new TowerPoint[amountOfDisc];pointB=new TowerPoint[amountOfDisc];pointC=new TowerPoint[amountOfDisc];int vertialDistance=discHeight;for(ii<pointA.nt i=0;length;i++){pointA[i]=new TowerPoint(maxDiscWidth,100+vertialDistance);vertialDistance=vertialDistance+discHeight;}vertialDistance=discHeight;for(int i=0;i<pointB.length;i++){pointB[i]=new TowerPoint(2*maxDiscWidth,100+vertialDistance);vertialDistance=vertialDistance+discHeight;}vertialDistance=discHeight;for(int i=0;i<pointC.length;i++){pointC[i]=new TowerPoint(3*maxDiscWidth,100+vertialDistance);vertialDistance=vertialDistance+discHeight;}for(int i=0;i<pointA.length;i++){pointA[i].putDisc(disc[i],this);}handleMouse.setPointA(pointA);handleMouse.setPointB(pointB);handleMouse.setPointC(pointC);autoMoveDisc=new AutoMoveDisc(this);autoMoveDisc.setTowerName(towerName);autoMoveDisc.setAmountOfDisc(amountOfDisc);autoMoveDisc.setPointA(pointA);autoMoveDisc.setPointB(pointB);autoMoveDisc.setPointC(pointC);validate();repaint();}public void removeDisk(){if(pointA!=null){for(int i=0;i<pointA.length;i++){pointA[i].removeDisc(pointA[i].getDiscOnPoint(),this);pointB[i].removeDisc(pointB[i].getDiscOnPoint(),this);pointC[i].removeDisc(pointC[i].getDiscOnPoint(),this);}}}public void paintComponent(Graphics g){super.paintComponent(g);int x1,y1,x2,y2;x1=pointA[0].getX();y1=pointA[0].getY()-discHeight/2;x2=pointA[amountOfDisc-1].getX();y2=pointA[amountOfDisc-1].getY()+discHeight/2;g.drawLine(x1,y1,x2,y2);x1=pointB[0].getX();y1=pointB[0].getY()-discHeight/2;x2=pointB[amountOfDisc-1].getX();y2=pointB[amountOfDisc-1].getY()+discHeight/2;g.drawLine(x1,y1,x2,y2);x1=pointC[0].getX();y1=pointC[0].getY()-discHeight/2;x2=pointC[amountOfDisc-1].getX();y2=pointC[amountOfDisc-1].getY()+discHeight/2;g.drawLine(x1,y1,x2,y2);g.setColor(Color.blue);x1=pointA[amountOfDisc-1].getX()-maxDiscWidth/2;y1=pointA[amountOfDisc-1].getY()+discHeight/2;x2=pointC[amountOfDisc-1].getX()+maxDiscWidth/2;y2=pointC[amountOfDisc-1].getY()+discHeight/2;int length=x2-x1,height=6;g.fillRect(x1,y1,length,height);int size=5;for(int i=0;i<pointA.length;i++){g.fillOval(pointA[i].getX()-size/2,pointA[i].getY()-size/2,size,size);g.fillOval(pointB[i].getX()-size/2,pointB[i].getY()-size/2,size,size);g.fillOval(pointC[i].getX()-size/2,pointC[i].getY()-size/2,size,size);}g.drawString(towerName[0]+"座",pointA[amountOfDisc-1].getX(),pointA[amountOfDisc-1].getY()+50);g.drawString(towerName[1]+"座",pointB[amountOfDisc-1].getX(),pointB[amountOfDisc-1].getY()+50);g.drawString(towerName[2]+"座",pointC[amountOfDisc-1].getX(),pointC[amountOfDisc-1].getY()+50);}}import java.awt.*;public class TowerPoint{int x,y;boolean haveDisc;Disc disc=null;public TowerPoint(int x,int y){this.x=x;this.y=y;}public boolean isHaveDisc(){return haveDisc;}public void setHaveDisc(boolean boo){haveDisc=boo;}public int getX(){return x;}public int getY(){return y;}public boolean equals(TowerPoint p){if(p.getX()==this.getX()&&p.getY()==this.getY())return true;elsereturn false;}public void putDisc(Component com,Container con){ disc=(Disc)com;con.setLayout(null);con.add(disc);int w=disc.getBounds().width;int h=disc.getBounds().height;disc.setBounds(x-w/2,y-h/2,w,h);haveDisc=true;disc.setPoint(this);con.validate();}public Disc getDiscOnPoint(){return disc;}public void removeDisc(Component com,Container con){ if(com!=null)con.remove(com);con.validate();}}。

相关文档
最新文档