用C语言编写汗诺塔的代码谁知道哪里有?

作者&投稿:源先 (若有异议请与网页底部的电邮联系)
如何用c#编汗诺塔??急用。~

using System;
using System.Collections.Generic;
using System.Text;

namespace Hannoi
{
class Han //2008 Varrily
{
public void Move(int n, char x, char y)
{
Console.WriteLine("No.{0} From {1} Move to {2}", n, x, y);
}
public 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);
}
}
}
class Program
{
static void Main(string[] args)
{
int Number;
Console.Write("Input Disk Number : ");
Number = Convert.ToInt32(Console.ReadLine());
Han Result = new Han();
Result.Hannoi(Number,'A','B','C');
Console.ReadLine();
}
}
}

/** 这个上网一搜一大把,楼主以后google、baidu
*本程序完成的功能是利用汉递规算法实现汉诺塔的动态演示程序
*/
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; i<adisk.length; i++)
adisk[i] = 1;
bdisk = new int[diskNum];
for(int k=0; k<bdisk.length; k++)
bdisk[k] = 0;
cdisk = new int[diskNum];
for(int i=0; i<cdisk.length; i++)
cdisk[i] = 0;
repaint();
if(animate == null || !animate.isAlive())//创建一个线程
{
animate = new Thread(this);
animate.start();
}
}
if(command.equals(停止))
{
for(int k=0; k<bdisk.length; k++)
bdisk[k] = 0;
for(int i=0; i<cdisk.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){}
}
}

/********hanoi.c*********/
#include <graphics.h>
struct H
{
int data[15];/*存放每个盘的代号*/
int top;/*每个塔的具体高度*/
}num[3];/*三个塔*/
void move(char x,char y,struct H num[3]);/*移动的具体过程*/
void hanoi(char x,char y,char z,int n,struct H num[3]);/*递归*/
void Init(void);/*初始化*/
void Close(void);/*图形关闭*/
int computer=1;/*自动控制与手动控制的标志*/
int speed=0;/*全局变量speed主要是演示过程的速度*/
void main(void)
{
Init();/*初始状态*/
Close();/*图形关闭*/
exit(0);
}
void Init(void)/*初始化*/
{
int gd=DETECT,gm;
int i,n,color;
clrscr();
printf("please input n(n<=10): ");/*输入要演示的盘子数*/
scanf("%d",&n);
printf("Please input 1 or 2:\n1.computer 2.people\n");
scanf("%d",&i);
if(i==2)/*选择手动控制标志为0*/
computer=0;
if(n<1||n>10)
n=10;/*越界的话n当10处理*/
if(computer)/*如果是自动控制的话输入速度*/
{
printf("please input speed: ");/*输入速度*/
scanf("%d",&speed);
}
initgraph(&gd,&gm,"c:\\tc");
cleardevice();
for(i=0;i<3;i++)
num[i].top=-1;/*三个地方的高度开始都为-1*/
for(i=0;i<n;i++)/*画一开始的塔座A上的盘子*/
{
num[0].top++;/*栈的高度加1*/
num[0].data[num[0].top]=i; /*最大的盘子代号为0,依次为1,2,…n-1*/
color=num[0].data[num[0].top]+1;/*盘子的颜色代码为栈顶盘子代号加1*/
setfillstyle(SOLID_FILL,color);
bar(100-(33-3*num[0].data[num[0].top]),400-20*i-8,100+
(33-3*num[0].data[num[0].top]),400-20*i+8); /*画矩形*/
}
setcolor(YELLOW);
outtextxy(180,450,"any key to continue");
settextstyle(0,0,2);
outtextxy(90,420,"A"); /*塔座标志*/
outtextxy(240,420,"B");
outtextxy(390,420,"C");
getch();/*接收字符后就执行递归操作*/
hanoi('a','b','c',n,num);
}
void move(char x,char y,struct H num[3])/*移动的具体过程*/
{
int i;
char num1[3],num2[3];
sprintf(num1,"%c",x-32);/*将小写变成大写,并转换成字符串输出*/
sprintf(num2,"%c",y-32);
setfillstyle(SOLID_FILL,BLACK);/*把原来的地方移去涂黑*/
bar(0,0,640,60);
setcolor(RED);
outtextxy(150,30,num1);/*输出移动过程*/
outtextxy(200,30,"--->");
outtextxy(310,30,num2);
settextstyle(0,0,2);
setfillstyle(SOLID_FILL,BLACK);/*把原来的地方移去涂黑*/
bar(100+150*(x-97)-(33-3*num[x-97].data[num[x-97].top]),
400-20*num[x-97].top-8,100+150*(x-97)+(33-3*
num[x-97].data[num[x-97].top]),400-20*num[x-97].top+8);
num[y-97].top++;/*入栈,目标点的top加1*/
num[y-97].data[num[y-97].top]=num[x-97].data[num[x-97].top];/*在目标点盘子的代号与源点盘子的代号相同*/
num[x-97].top--;/*出栈,原来地方的top减1*/
setfillstyle(SOLID_FILL,num[y-97].data[num[y-97].top]+1);/*盘子颜色代码是栈顶盘子代号加1*/
bar(100+150*(y-97)-(33-3*num[y-97].data[num[y-97].top]),
400-20*num[y-97].top-8,100+150*(y-97)+
(33-3*num[y-97].data[num[y-97].top]),400-20*num[y-97].top+8);
if(computer)/*自动控制就用delay*/
delay(speed);/*延时函数*/
else
getch();/*手动控制的话就自己按键盘来控制*/
}
void hanoi(char one,char two,char three,int n,struct H num[3])/*递归n为盘子数,num为堆栈*/
{
if(n==1)
move(one,three,num);/*如果盘子为1,将这个盘子从塔座A移动到塔座C*/
else
{
hanoi(one,three,two,n-1,num);/*将塔座A的前n-1个盘子移到塔座B*/
move(one,three,num);/*将塔座A的第n个盘子移到塔座C*/
hanoi(two,one,three,n-1,num); /*将塔座B的n-1个盘子移到塔座C*/
}
}
void Close(void)/*图形关闭*/
{
getch();
closegraph();
}

#include"stdio.h"
void move(char x,char y)
{
printf("%c-->%c\n",x,y);
}
void hanoi(int n,char one,char two,char three)
/*将n个盘从one座借助two座,移到three座*/
{
if(n==1) move(one,three);
else
{
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
}
main()
{
int m;
printf("input the number of diskes:"); /*输入盘子个数*/
scanf("%d",&m);
printf("The step to moving %3d diskes:\n",m); /*步骤*/
hanoi(m,'A','B','C'); /*A为起始座,B为借助,C为目标座*/
}


汉诺塔c语言算法。注意是算法
我以前收藏了一个别人的回答,你看看吧:递归算法的出发点不是由初始条件出发,而是把出发点放在求解的目标上,从所求的未知项出发逐次调用本身的求解过程,直到递归的边界(即初始条件)。汉诺塔问题的重点是分析移动的规则,找到规律和边界条件。若需要将n个盘子从A移动到C就需要(1)将n-1个盘子从A...

用c语言编写程序求汉诺塔的移动步骤
2014-11-27 求真正理解汉诺塔问题的编程大神回答一下,当n=3时,用c语言... 45 2012-10-06 谁能给我讲一下,用c语言编写的汉诺塔程序,是怎么实现递归的啊 1 2014-07-15 .编程实现汉诺塔中盘子移动过程的动画演示功能。(C语言设计) 2012-08-22 C语言汉诺塔问题,编程打印盘子移动过程 2016-05-12 汉诺...

将下面这个题用C语言编程 感谢大神
\/* 汉诺塔 hannota.c *\/ include \/ 解法:如果柱子标为ABC,要由A搬至C,在只有一个盘子时,就将它直接搬至C,当有两个盘子,就将B当作辅助柱。如果盘数超过2个,将第三个以下的盘子遮起来,就很简单了,每次处理两个盘子,也就是:A->B、A->C、B->C这三个步骤,而被遮住的部份,其实...

在编写C语言程序求解汉诺塔问题时怎样表示每一步是第几步?
您好,可以这样 汉诺塔(Hanoi)是必须用递归方法才能解决的经典问题。它来自于印度神话。上帝创造世界时作了三根金刚石柱子,在第一根柱子上从下往上按大小顺序摞着64片黄金圆盘,如图7-3所示。上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放到第二根柱子上,并且规定,每次只能移动一个圆盘,在小圆盘...

用C语言编程序解决汉诺塔问题
include "stdafx.h"include <stdio.h> include <stdlib.h> int count;void movedisk(int,char,char,char);int _tmain(int argc, _TCHAR* argv[]){ int n;printf("输入盘子的数量:");scanf("%d",&n) ;movedisk(n,'A','C','B');printf("盘子数量%d的时候移动了%d次\\n",n,count...

汉诺塔的C语言代码怎么写啊
\/*5. 源程序*\/ \/***hanoi.c***\/ include <graphics.h> struct H { int data[15];\/*存放每个盘的代号*\/ int top;\/*每个塔的具体高度*\/ }num[3];\/*三个塔*\/ void move(char x,char y,struct H num[3]);\/*移动的具体过程*\/ void hanoi(char x,char y,char z,int n,struct...

用C语言代码来编写含汉诺塔问题,利用堆栈来实现.求代码
若移动的圆盘为 n(n>1),则分成几步走:把 (n-1) 个圆盘从 A 针移动到 B 针(借助 C 针);A 针上的最后一个圆盘移动到 C 针;B 针上的 (n-1) 个圆盘移动到 C 针(借助 A 针)。每做一遍,移动的圆盘少一个,逐次递减,最后当 n 为 1 时,完成整个移动过程。因此,解决汉诺...

汉诺塔C语言,摆脱解释下核心函数
这是"递归"if(n==1) move(one,three); 如果只有一个直接移到3上 else { hanoi(n-1,one,three,two); 将1上的n-1各通过3移到2 move(one,three); 再将1上最大的移到3 hanoi(n-1,two,one,three); 最后将 2上的n-1各通过1移到3上 ...

汉诺塔c语言的问题
n=1时,就直接执行形参a到形参c(按照图片格式打印输出字符串就行了啊)。其它情况按照递归,先通过c先把小的都移动到b,再把最大的移动到c,最后通过a把b所有盘移动到c。最后输出就是你图中效果。include<stdio.h> void doMove(int n,char x,char y);void move(int n,char a,char b,char...

求c语言,汉诺塔程序 非递归
2、把除第一片以外,可以移动的另外一片移动到可以移动的为止,这个看似模糊,但其实关系是确定的,这个时候只有一片可以移动,而且位置也只有一个可以让它移动。就是这么两个步骤,用来完成汉诺塔 下面是我的程序 (注:我在程序中作了个弊,如果是奇数片,那顺序一定是A->C->B,(其中A是原柱,B...

凤山县15647315328: 汉诺塔问题的C语言程序应该怎么写?并请说明一下原因 -
进邱茶苯: 其实主要就是三个步骤: 第一,把a上的n-1个盘通过c移动到b. 第二,把a上的最下面的盘移到c. 第三,因为n-1个盘全在b上了,所以把b当做a重复以上步骤就好了.#include<stdio.h>void move(int n,char a,char b,char c) {if(n==1)printf("\t...

凤山县15647315328: 求真正理解汉诺塔问题的电脑大神给我解答一下,当n=3时,求用c语言编写的汉诺塔递归调用代码的详细执 -
进邱茶苯: 一开始我接触汉诺塔也是很不解,随着代码量的积累,现在很容易就看懂了,因此楼主主要还是对递归函数的理解不够深刻,建议你多写一些递归程序,熟练了自己就能理解.圆盘逻辑移动过程+程序递归过程分析 hanoi塔问题, 算法分析如下...

凤山县15647315328: C语言 -- 汉诺塔程序执行步骤 -
进邱茶苯: 这个问题你要先把递归搞懂才能理解的, 最好是单跟踪执行一下, 我这里就简单说一下吧! hanoi(5, 'a', 'b', 'c');把5个从'a'移到'c' 这时n=5, noe='a', two='b', three='c' 因为n!=1, 执行else里的 hanoi( 4, 'a', 'c', 'b'); //把上面4个从a移到b move( 'a', 'c'...

凤山县15647315328: 汉诺塔n=4(4个盘)c语言递归编程代码 -
进邱茶苯: /**************************** 汉诺塔的算法就3个步骤:第一,把a上的n-1个盘通过c移动到b.第二,把a上的最下面的盘移到c.a成了空的.第三,因为n-1个盘全在b上了,所以把b当做a.重复以上步骤就好了.所以算法看起来就简单多了.*********...

凤山县15647315328: 在编写C语言程序求解汉诺塔问题时怎样表示每一步是第几步? -
进邱茶苯: 可以设置一个全局变量K并初始化为0,然后在输出时,增加一项输出为++k

凤山县15647315328: c语言汉诺塔问题 程序编译 -
进邱茶苯: hanoi(n-1,a,c,b); /* 第一步:把A上部的n-1个盘子,借助C,先移动到B */ move(n,a,c); /* 第二步:把A最底部的第n号盘子移动到C */ hanoi(n-1,b,a,c); /* 第三步:把第一步移到B的n-1个盘子借助A移动到C *//*****************************************...

凤山县15647315328: 汉诺塔C语言算法程序 -
进邱茶苯: void movie(char x, char y) { printf("%c-->%c\n", x, y); } void hanoi(int n, char one, char two, char three) { if (n == 1) move(one, three); else { hanoi(n -1, one, three, two); movie(one, three); hanoi(n - 1, two, three, one); }

凤山县15647315328: C语言 实现汉诺塔 -
进邱茶苯: #includevoid main() { void hanoi(int n,char one,char two,char three); int n; printf("please input the number of diskes:\n"); scanf("%d",&n); printf("the steps to moving is:\n"); hanoi(n,'A','B','C'); } void hanoi(int n,char one ,char two ,char three)//...

凤山县15647315328: c语言编程问题,求解.(汉诺塔) -
进邱茶苯: 恩 昨天用 python 写的 c语言版本#include //第一个塔为初始塔,中间的塔为借用塔,最后一个塔为目标塔 int i=1;//记录步数 void move(int n,char from,char to) //将编号为n的盘子由from移动到to {printf("第%d步:将%d号盘子%c---->%c\n",i++...

凤山县15647315328: 用C语言代码来编写含汉诺塔问题,利用顺序栈来实现.求代码 -
进邱茶苯: void hanoi(int n,char x,char y,char 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);} }

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网