汉诺塔 java 程序
汉诺塔游戏-----用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实现

本 目 任 辑: 嫒 栏 贵编 谢 嫒
. . . 开 发研 究 与设 计技 术 . .. 。
‘ 诺塔 ’ ‘ 汉 ’ 的算法 分析及 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实现汉诺塔(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 实现汉诺塔详解及实现代码汉诺塔问题:有三根柱⼦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递归算法经典题目,帮助您更好地理解和掌握递归算法。
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描述)汉诺塔:(又称河内塔)问题是源于印度一个古老传说的益智玩具。
大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着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编程
辽宁工业大学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语言汉诺塔问题递归算法汉诺塔问题是经典的递归问题,要求将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个盘子从起始柱移动到辅助柱和将最后一个盘子从起始柱移动到目标柱两个子问题。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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();}}。