正文
河内塔java代码 河内塔规则
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
求汉诺塔 程序 谢谢大家
package java0308;
public class HanNuoTa {
static int panzi = 4;
public static void f(int n, char A, char B, char C) {
if (n == 1)
System.out.println("盘子1从" + A + "到" + C);
else {
f(n - 1, A, C, B);
System.out.println("盘子" + n + "从" + A + "到" + C);
f(n - 1, B, A, C);
}
}
public static void main(String[] args) {
f(panzi, 'A', 'B', 'C');
}
}
汉诺塔问题?
汉诺塔(又称河内塔)问题是印度的一个古老的传说。开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。解答结果请自己运行计算,程序见尾部。面对庞大的数字(移动圆片的次数)18446744073709551615,看来,众僧们耗尽毕生精力也不可能完成金片的移动。
后来,这个传说就演变为汉诺塔游戏:
1.有三根杆子A,B,C。A杆上有若干碟子
2.每次移动一块碟子,小的只能叠在大的上面
3.把所有碟子从A杆全部移到C杆上
经过研究发现,汉诺塔的破解很简单,就是按照移动规则向一个方向移动金片:
如3阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C
此外,汉诺塔问题也是程序设计中的经典递归问题。
算法思路:
1.如果只有一个金片,则把该金片从源移动到目标棒,结束。
2.如果有n个金片,则把前n-1个金片移动到辅助的棒,然后把自己移动到目标棒,最后再把前n-1个移动到目标棒
(非专业人士可以忽略以下内容)
补充:汉诺塔的算法实现(c++)
#include
#include
using namespace std;
ofstream fout("out.txt");
void Move(int n,char x,char y)
{
fout"把"n"号从"x"挪动到"yendl;
}
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()
{
fout"以下是7层汉诺塔的解法:"endl;
Hannoi(7,'a','b','c');
fout.close();
cout"输出完毕!"endl;
return 0;
}
C语言精简算法
/* Copyrighter by SS7E */
#include /* Copyrighter by SS7E */
void hanoi(int n,char A,char B,char C) /* Copyrighter by SS7E */
{
if(n==1)
{
printf("Move disk %d from %c to %c\n",n,A,C);
}
else
{
hanoi(n-1,A,C,B); /* Copyrighter by SS7E */
printf("Move disk %d from %c to %c\n",n,A,C);
hanoi(n-1,B,A,C); /* Copyrighter by SS7E */
}
}
main() /* Copyrighter by SS7E */
{
int n;
printf("请输入数字n以解决n阶汉诺塔问题:\n");
scanf("%d",n);
hanoi(n,'A','B','C');
}/* Copyrighter by SS7E */
PHP算法:
?php
function hanoi($n,$x,$y,$z){
if($n==1){
move($x,1,$z);
}else{
hanoi($n-1,$x,$z,$y);
move($x,$n,$z);
hanoi($n-1,$y,$x,$z);
}
}
function move($x,$n,$z){
echo 'move disk '.$n.' from '.$x.' to '.$z.'
';
}
hanoi(10,'x','y','z');
?
JAVA算法:
public class Haniojava
{
public static void main(String args[])
{
byte n=2;
char a='A',b='B',c='C';
hanio(n,a,b,c);
}
public static void hanio(byte n,char a,char b,char c)
{
if(n==1)
System.out.println("move "+a+" to "+b);
else
{
hanio((byte)(n-1),a,c,b);
System.out.println("move "+a+" to "+b);
hanio((byte)(n-1),c,b,a);
}
}
}
#include
void move(char ch1, char ch2) {
coutch1"ch2' ';
}
void hanoi(int n, char a, char b, char c) {
if (n==1)
move (a,c);
else {
hanoi (n-1,a,c,b);
move (a,c);
hanoi (n-1,b,a,c);
}
}
void main() {
int m;
cout"Enter the number of disk to move:\n";
cinm;
cout"The step to moving "m" disk:\n";
hanoi (m,'A','B','C');
cinm;
}
用不了这么复杂
,设A上有n个盘子。
如果n=1,则将圆盘从A直接移动到C。
如果n=2,则:
1.将A上的n-1(等于1)个圆盘移到B上;
2.再将A上的一个圆盘移到C上;
3.最后将B上的n-1(等于1)个圆盘移到C上。
如果n=3,则:
A. 将A上的n-1(等于2,令其为n`)个圆盘移到B(借助于C),步骤如下:
(1)将A上的n`-1(等于1)个圆盘移到C上。
(2)将A上的一个圆盘移到B。
(3)将C上的n`-1(等于1)个圆盘移到B。
B. 将A上的一个圆盘移到C。
C. 将B上的n-1(等于2,令其为n`)个圆盘移到C(借助A),步骤如下:
(1)将B上的n`-1(等于1)个圆盘移到A。
(2)将B上的一个盘子移到C。
(3)将A上的n`-1(等于1)个圆盘移到C。
到此,完成了三个圆盘的移动过程。
从上面分析可以看出,当n大于等于2时,移动的过程可分解为三个步骤:
第一步 把A上的n-1个圆盘移到B上;
第二步 把A上的一个圆盘移到C上;
第三步 把B上的n-1个圆盘移到C上;其中第一步和第三步是类同的。
当n=3时,第一步和第三步又分解为类同的三步,即把n`-1个圆盘从一个针移到另一个针上,这里的n`=n-1。 显然这是一个递归过程,据此算法可编程如下:
move(int n,int x,int y,int z)
{
if(n==1)
printf("%c--%c\n",x,z);
else
{
move(n-1,x,z,y);
printf("%c--%c\n",x,z);
move(n-1,y,x,z);
}
}
main()
{
int h;
printf("\ninput number:\n");
scanf("%d",h);
printf("the step to moving %2d diskes:\n",h);
move(h,'a','b','c');
}
java汉诺塔(河内塔)问题。解释一下汉诺塔为3时怎么想
你把1,2盘看成一个特殊的盘。所以现在n=2,当n=2时,需先把1盘移动到B塔中,把1-3步一起看,作用即把特殊盘移动至B。
然后把3盘移动至C塔,即第4步。
最后,把特殊盘移动到C塔上,同样把5-7步一起看,达到的效果即把特殊盘移动至C盘,完成!!
等于4的时候
,其实就是把123盘看成特殊盘!同样的道理,因为汉诺塔是递归实现的,明白之后很简单。
小学四年级河内塔问题!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!火急!!!!!!火急!!!!!!!火急!!!
汉诺塔是源自印度神话里河内塔java代码的玩具。 上帝创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按大小顺序摞着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 假如每秒钟一次,共需多长时间呢河内塔java代码?一个平年365天有 31536000 秒,闰年366天有31622400秒,平均每年31556952秒,计算一下, 18446744073709551615/31556952=584554049253.855年 这表明移完这些金片需要5845亿年以上,而地球存在至今不过45亿年,太阳系的预期寿命据说也就是数百亿年。真的过了5845亿年,不说太阳系和银河系,至少地球上的一切生命,连同梵塔、庙宇等,都早已经灰飞烟灭。 和汉诺塔故事相似的,还有另外一个印度传说:舍罕王打算奖赏国际象棋的发明人——宰相西萨·班·达依尔。国王问他想要什么,他对国王说:“陛下,请您在这张棋盘的第1个小格里赏给河内塔java代码我一粒麦子,在第2个小格里给2粒,第3个小格给4粒,以后每一小格都比前一小格加一倍。请您把这样摆满棋盘上所有64格的麦粒,都赏给您的仆人吧!”国王觉得这个要求太容易满足了,就命令给他这些麦粒。当人们把一袋一袋的麦子搬来开始计数时,国王才发现:就是把全印度甚至全世界的麦粒全拿来,也满足不了那位宰相的要求。 那么,宰相要求得到的麦粒到底有多少呢?总数为 1+2+2^2 + … +2^63 =2^64-1 和移完汉诺塔的次数一样。我们已经知道这个数字有多么大了。 人们估计,全世界两千年也难以生产这么多麦子!
预言
有预言说,这件事完成时宇宙会在一瞬间闪电式毁灭。也有人相信婆罗门至今还在一刻不停地搬动着圆盘。
编辑本段汉诺塔与宇宙寿命
如果移动一个圆盘需要1秒钟的话,等到64个圆盘全部重新落在一起,宇宙被毁灭是什么时候呢? 让我们来考虑一下64个圆盘重新摞好需要移动多少次吧。1个的时候当然是1次,2个的时候是3次,3个的时候就用了7次......这实在是太累了 因此让我们逻辑性的思考一下吧。 4个的时候能够移动最大的4盘时如图所示。 到此为止用了7次。 接下来如下图时用1次,在上面再放上3个圆盘时还要用7次(把3个圆盘重新放在一起需要的次数)。 因此,4个的时候是 “3个圆盘重新摞在一起的次数”+1次+“3个圆盘重新摞在一起需要的次数” =2x“3个圆盘重新摞在一起的次数”+1次 =15次。 那么,n个的时候是 2x“(n-1)个圆盘重新摞在一起的次数”+1次。 由于1 个的时候是1次,结果n个的时候为(2的n次方减1)次。 1个圆盘的时候 2的1次方减1 2个圆盘的时候 2的2次方减1 3个圆盘的时候 2的3次方减1 4个圆盘的时候 2的4次方减1 5个圆盘的时候 2的5次方减1 ........ n个圆盘的时候 2的n次方减1 也就是说,n=64的时候是(2的64次方减1)次。 因此,如果移动一个圆盘需要1秒的话, 宇宙的寿命=2的64次方减1(秒) 2的64次方减1到底有多大呢?动动计算器,答案是一个二十位的数字: 18446744073709551615 用一年=60秒x60分x24小时x365天来算的话,大约有5800亿年吧。 据说,现在的宇宙年龄大约是150亿年,还差得远呢。 汉诺塔问题在数学界有很高的研究价值, 而且至今还在被一些数学家们所研究, 也是我们所喜欢玩的一种益智游戏, 它可以帮助开发智力,激发我们的思维。
编辑本段concreteHAM:
现在有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,现在把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方,请问至少需要多少次移动,设移动次数为H(n)。 首先我们肯定是把上面n-1个盘子移动到柱子C上,然后把最大的一块放在B上,最后把C上的所有盘子移动到B上,由此我们得出表达式: H(1) = 1 H(n) = 2*H(n-1)+1 (n1) 那么我们很快就能得到H(n)的一般式: H(n) = 2^n - 1 (n0) 并且这种方法的确是最少次数的,证明非常简单,可以尝试从2个盘子的移动开始证,河内塔java代码你可以试试。 进一步加深问题(解法原创*_*): 假如现在每种大小的盘子都有两个,并且是相邻的,设盘子个数为2n,问:(1)假如不考虑相同大小盘子的上下要多少次移动,设移动次数为J(n);(2)只要保证到最后B上的相同大小盘子顺序与A上时相同,需要多少次移动,设移动次数为K(n)。 (1)中的移动相当于是把前一个问题中的每个盘子多移动一次,也就是: J(n) = 2*H(n) = 2*(2^n - 1) = 2^(n+1)-2
在分析(2)之前
,我们来说明一个现象,假如A柱子上有两个大小相同的盘子,上面一个是黑色的,下面一个是白色的,我们把两个盘子移动到B上,需要两次,盘子顺序将变成黑的在下,白的在上,然后再把B上的盘子移动到C上,需要两次,盘子顺序将与A上时相同,由此我们归纳出当相邻两个盘子都移动偶数次时,盘子顺序将不变,否则上下颠倒。 现在回到最开始的问题,n个盘子移动,上方的n-1个盘子总移动次数为2*H(n-1),所以上方n-1个盘子的移动次数必定为偶数次,最后一个盘子移动次数为1次。
讨论问题(2),
综上两点,可以得出,要把A上2n个盘子移动到B上,首先可以得出上方的2n-2个盘子必定移动偶数次,所以顺序不变,移动次数为: J(n-1) = 2^n-2 然后再移动倒数第二个盘子,移动次数为2*J(n-1)+1 = 2^(n+1)-3, 最后移动最底下一个盘子,所以总的移动次数为: K(n) = 2*(2*J(n-1)+1)+1 = 2*(2^(n+1)-3)+1 = 2^(n+2)-5 开天辟地的神勃拉玛(和中国的盘古差不多的神吧)在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。计算结果非常恐怖(移动圆片的次数)18446744073709551615,众僧们即便是耗尽毕生精力也不可能完成金片的移动了。
算法介绍:
其实算法非常简单,当盘子的个数为n时,移动的次数应等于2^n – 1(有兴趣的可以自己证明试试看)。后来一位美国学者发现一种出人意料的简单方法,只要轮流进行两步操作就可以了。首先把三根柱子按顺序排成品字型,把所有的圆盘按从大到小的顺序放在柱子A上,根据圆盘的数量确定柱子的排放顺序:若n为偶数,按顺时针方向依次摆放 A B C; 若n为奇数,按顺时针方向依次摆放 A C B。 (1)按顺时针方向把圆盘1从现在的柱子移动到下一根柱子,即当n为偶数时,若圆盘1在柱子A,则把它移动到B;若圆盘1在柱子B,则把它移动到C;若圆盘1在柱子C,则把它移动到A。 (2)接着,把另外两根柱子上可以移动的圆盘移动到新的柱子上。即把非空柱子上的圆盘移动到空柱子上,当两根柱子都非空时,移动较小的圆盘。这一步没有明确规定移动哪个圆盘,你可能以为会有多种可能性,其实不然,可实施的行动是唯一的。 (3)反复进行(1)(2)操作,最后就能按规定完成汉诺塔的移动。 所以结果非常简单,就是按照移动规则向一个方向移动金片: 如3阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C 汉诺塔问题也是程序设计中的经典递归问题,下面我们将给出递归和非递归的不同实现源代码。
编辑本段汉诺塔问题的程序实现
汉诺塔问题的递归实现:
#includestdio.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; //圆盘的个数最多为64 const 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^y void 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; in; i++) ta[0].s[i] = n - i; //柱子B,C上开始没有没有圆盘 ta[1].top = ta[2].top = 0; for (int i=0; in; i++) ta[1].s[i] = ta[2].s[i] = 0; //若n为偶数,按顺时针方向依次摆放 A B C if (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; iy; 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;ipow(2,n);i++) isrev[i]=false; //循环计算是否逆序 for(int ci=2;ci=n;ci++) { for(int zixh=(int)pow(2,ci-1);zixhpow(2,ci);zixh+=4) //初始值重复一次,自增值可加4,减少循环次数。 isrev[zixh]=isrev[(int)pow(2,ci)-zixh]; //该位置为中间位置,且奇次幂逆序,偶数幂不逆序 isrev[(int)pow(2,ci)]=((ci-1)%2==0)?false:true; } char lch='A',rch; rch=(n%2==0?'B':'C'); printf("%d\t",1); printf("%c-%c",lch,rch); print(lch,rch); for(int k=2;kpow(2,n);k++) { if(k%2==0) rch=charis(lch,n); else lch=charis(rch,n); printf("%d\t",k); if(isrev[k]) { printf("%c-%c",rch,lch); print(rch,lch); } else { printf("%c-%c",lch,rch); print(lch,rch); } } } int main() { int n; printf("Input the num:"); scanf("%d",n); zhua[0]=n; for(int i=1;i=n;i++) zhua[i]=n-i+1; Hannuo(n); return 0; } 汉诺塔
汉诺塔问题的递归Java语言实现
import java.util.Scanner; public class HanoiTest { public static void hanoi(int level,String a,String b,String c){ if(level==1) move(1,a,c); else { hanoi(level-1,a,c,b); move(level,a,c); hanoi(level-1,b,a,c); } } static void move(int level,String a,String b){ System.out.println(level+"层:"+a+"----"+b); } public static void main(String[] args) { Scanner sc = new Scanner();//括号中是输入,提交不上去所以就没写 System.out.println("请输入汉诺塔的层数:"); int n = sc.nextInt(); System.out.println(n + "层汉诺塔的解法是:"); hanoi(n,"A","B","C"); } }
哈诺塔问题的递归pascal语言实现
var m:integer; procedure move(f,putone:char); begin writeln(getone,'-',putone) end; procedure hanoi(n:integer;one,two,three:char); begin if n=1 then move(one,three) else begin hanoi(n-1,one,three,two); move(one,three); hanoi(n-1,two,one,three) end end; begin readln(m); write('the step to moving disks:'); writeln; hanoi(m,'A','B','C') end.
谁帮我解释一下河内塔程序?
汉诺塔问题是程序设计中河内塔java代码的经典递归问题。 算法思路: 1.如果只有一个金片河内塔java代码,则把该金片从源移动到目标棒,结束。 2.如果有n个金片,则把前n-1个金片移动到辅助的棒,然后把自己移动到目标棒,最后再把前n-1个移动到目标棒 补充:汉诺塔的算法实现(c++) #include fstream #include iostream using namespace std; ofstream fout("out.txt"); void Move(int n,char x,char y) { fout"把"n"号从"x"挪动到"yendl; } 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() { fout"以下是7层汉诺塔的解法:"endl; Hannoi(7,'a','b','c'); fout.close(); cout"输出完毕河内塔java代码!"endl; return 0; } C语言精简算法 /* Copyrighter by SS7E */ #includestdio.h /* Copyrighter by SS7E */ void hanoi(int n,char A,char B,char C) /* Copyrighter by SS7E */ { if(n==1) { printf("Move disk %d from %c to %c\n",n,A,C); } else { hanoi(n-1,A,C,B); /* Copyrighter by SS7E */ printf("Move disk %d from %c to %c\n",n,A,C); hanoi(n-1,B,A,C); /* Copyrighter by SS7E */ } } main() /* Copyrighter by SS7E */ { int n; printf("请输入数字n以解决n阶汉诺塔问题:\n"); scanf("%d",n); hanoi(n,'A','B','C'); }/* Copyrighter by SS7E */ PHP算法: ?php function hanoi($n,$x,$y,$z){ if($n==1){ move($x,1,$z); }else{ hanoi($n-1,$x,$z,$y); move($x,$n,$z); hanoi($n-1,$y,$x,$z); } } function move($x,$n,$z){ echo 'move disk '.$n.' from '.$x.' to '.$z.'br'; } hanoi(10,'x','y','z'); ? JAVA算法: public class Haniojava { public static void main(String args[]) { byte n=2; char a='A',b='B',c='C'; hanio(n,a,b,c); } public static void hanio(byte n,char a,char b,char c) { if(n==1) System.out.println("move "+a+" to "+b); else { hanio((byte)(n-1),a,c,b); System.out.println("move "+a+" to "+b); hanio((byte)(n-1),c,b,a); } } }
求java版汉诺塔的演示程序
源代码:
/**
*本程序完成的功能是利用汉递规算法实现汉诺塔的动态演示程序
*/
import javax.swing.*;
import java.awt.geom.*;
import java.awt.event.*;
import java.awt.*;
public class Hanio extends JApplet implements ActionListener, Runnable
{
/**
*diskNum是盘子的数量
*/
private int diskNum ;
/**
*各个组件的句柄
*/
private JButton begin, stop;
private JLabel lDiskNum;
private JTextField text;
JPanel pane;
/**
*定义一个线程句柄
*/
private Thread animate;
/**
*定义a,b,c三个柱子上是否有盘子,有哪些盘子
*/
private int adisk[];
private int bdisk[];
private int cdisk[];
public void init()
{
Container content = getContentPane();
content.setLayout(new BorderLayout());
lDiskNum = new JLabel(盘子的数目);
text = new JTextField(8);
begin = new JButton(开始);
begin.addActionListener(this);
stop = new JButton(停止);
stop.addActionListener(this);
pane = new JPanel();
pane.setLayout(new FlowLayout());
pane.add(lDiskNum);
pane.add(text);
pane.add(begin);
pane.add(stop);
content.add(pane, BorderLayout.SOUTH);
}
public void paint(Graphics g)
{
Graphics2D g2D = (Graphics2D)g;
Ellipse2D.Double ellipse;
g2D.setPaint(getBackground());
if(adisk != null)
{
/**
*消除以前画的盘子
*/
for(int j=adisk.length, i=0; --j=0; i++ )
{
ellipse = new Ellipse2D.Double(20+i*5, 180-i*10, 180-i*10, 20);
g2D.fill(ellipse);
ellipse = new Ellipse2D.Double(220+i*5, 180-i*10, 180-i*10, 20);
g2D.fill(ellipse);
ellipse = new Ellipse2D.Double(420+i*5, 180-i*10, 180-i*10, 20);
g2D.fill(ellipse);
}
drawEllipse(g, 20, adisk);//画A组盘子
drawEllipse(g, 220, bdisk);//画B组盘子
drawEllipse(g, 420, cdisk);//画C组盘子
}
pane.repaint();
}
public void update(Graphics g)
{
paint(g);
}
/**画出椭圆代表盘子,g是图形环境,x是最下面的盘子的横坐标,
*arr是柱子数组
*/
public void drawEllipse(Graphics g,int x,int arr[])
{
Graphics2D g2D = (Graphics2D)g;
Ellipse2D.Double ellipse;
g2D.setPaint(Color.gray);
g2D.draw(new Line2D.Double(x+90, 10, x+90, 180));
for(int j=arr.length, i=0; --j=0; i++ )
if(arr[j] != 0)
{
if(i%2 == 0)
g2D.setPaint(Color.blue);
else
g2D.setPaint(Color.red);
ellipse = new Ellipse2D.Double(x+i*5, 180-i*10, 180-i*10, 20);
g2D.fill(ellipse);
}
}
public void actionPerformed(ActionEvent e)
{
String command = e.getActionCommand();
if(command.equals(开始))
{
/**
*进行初始化,开始的时候只有a柱子上有盘子,其他柱子都没有
*/
diskNum = Integer.parseInt(text.getText());
adisk = new int[diskNum];
for(int i=0; iadisk.length; i++)
adisk[i] = 1;
bdisk = new int[diskNum];
for(int k=0; kbdisk.length; k++)
bdisk[k] = 0;
cdisk = new int[diskNum];
for(int i=0; icdisk.length; i++)
cdisk[i] = 0;
repaint();
if(animate == null || !animate.isAlive())//创建一个线程
{
animate = new Thread(this);
animate.start();
}
}
if(command.equals(停止))
{
for(int k=0; kbdisk.length; k++)
bdisk[k] = 0;
for(int i=0; icdisk.length; i++)
cdisk[i] = 0;
repaint();
text.setText();
animate = null;
}
}
/**
*线程方法,在此调用汉诺塔执行移动盘子操作
*/
public void run()
{
hanio(diskNum, 'A', 'B', 'C');
repaint();
}
/**
*汉诺塔递规调用程序,n是盘子的数量,A,B,C分别代表三个柱子
*/
public void hanio(int n, char A, char B, char C)
{
if(n 1)
{
hanio(n-1, A, C, B);
pause();//停顿几秒在执行
switch(A)
{
case 'A':adisk[n-1] = 0;break;
case 'B':bdisk[n-1] = 0;break;
case 'C':cdisk[n-1] = 0;break;
default:break;
}
switch(C)
{
case 'A':adisk[n-1] = 1;break;
case 'B':bdisk[n-1] = 1;break;
case 'C':cdisk[n-1] = 1;break;
default:break;
}
repaint();
hanio(n-1, B, A, C);
}
pause();
switch(A)
{
case 'A':adisk[n-1] = 0;break;
case 'B':bdisk[n-1] = 0;break;
case 'C':cdisk[n-1] = 0;break;
default:break;
}
switch(C)
{
case 'A':adisk[n-1] = 1;break;
case 'B':bdisk[n-1] = 1;break;
case 'C':cdisk[n-1] = 1;break;
default:break;
}
repaint();
}
/**
*每隔半妙钟移动一个盘子
*/
public void pause()
{
try{
Thread.sleep(500);//可以修改此值加快盘子移动的速度
}catch(InterruptedException e){}
}
}
河内塔java代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于河内塔规则、河内塔java代码的信息别忘了在本站进行查找喔。