重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

三阶汉诺塔java源代码,java编写汉诺塔代码

求JAVA汉诺塔相关的socket代码

定义了服务器线程类,服务器运行在一个单独的线程中。

成都创新互联公司专注于凤翔网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供凤翔营销型网站建设,凤翔网站制作、凤翔网页设计、凤翔网站官网定制、重庆小程序开发服务,打造凤翔网络公司原创品牌,更为您提供凤翔网站排名全网营销落地服务。

客户端运行在主线程中。

所有代码放在一个源文件中就行。源文件名是Hanoi.java

下面是源代码,输入的盘子数不要太大,20以内,否则会步数太多,输出耗时太久。

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintStream;

import java.net.InetAddress;

import java.net.ServerSocket;

import java.net.Socket;

import java.net.UnknownHostException;

import java.util.Scanner;

public class Hanoi {

public static void main(String[] args) {

//创建服务器

HanoiServer server = new HanoiServer();

server.start();//启动服务器

/*开始创建客户端*/

Socket socket = null;//客户端Socket

try {

socket = new Socket(InetAddress.getLocalHost(), 8888);

BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

PrintStream printStream = new PrintStream(socket.getOutputStream());

Scanner scanner=new Scanner(System.in);

System.out.println("请输入盘子数(3-10),数字太大,运算时间就会太长可能会卡死。");

printStream.print(scanner.nextInt());

printStream.println();

String line;

while ((line = reader.readLine()) != null) {

System.out.println(line);

}

} catch (UnknownHostException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} finally {

if (socket != null) {

try {

socket.close();

System.out.println("客户端socket关闭");

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

}

class HanoiServer extends Thread {//服务器线程类

private ServerSocket serverSocket;

public HanoiServer() {

try {

this.serverSocket = new ServerSocket(8888);

} catch (IOException e) {

e.printStackTrace();

}

}

private void hanoi(int n, String from, String inter, String to, PrintStream printStream) {

if (n == 1) {

printStream.print("Disk 1 from " + from + " to " + to);

printStream.println();

} else {

hanoi(n - 1, from, to, inter, printStream);

printStream.print("Disk " + n + " from " + from + " to " + to);

printStream.println();

hanoi(n - 1, inter, from, to, printStream);

}

}

@Override

public void run() {

Socket socket = null;

try {

socket = this.serverSocket.accept();

PrintStream printStream = new PrintStream(socket.getOutputStream());

BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

int n = Integer.parseInt(reader.readLine());

this.hanoi(n, "A", "B", "C", printStream);

} catch (IOException e) {

e.printStackTrace();

} finally {

if (socket != null) {

try {

socket.close();

System.out.println("服务器socket关闭");

} catch (IOException e) {

e.printStackTrace();

}

}

try {

this.serverSocket.close();

System.out.println("服务器serverSocket关闭");

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

求数据结构形式的汉诺塔源代码

●汉诺塔算法的递归实现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"输出完毕!"endl;

return 0;

}●汉诺塔算法的递归实现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;

}

}

}

}

JAVA汉诺塔

import java.awt.*;

public class TowerPoint //公共类TowerPoint

{

int x,y; //定义2个int类型的变量

boolean 有盘子; //定义一个boolean类型的变量

Disk 盘子=null; //初始化一个对象"盘子"并赋值为空

HannoiTower con=null; //初始化一个HannoiTower类的对象"con"并赋值为空

public TowerPoint(int x,int y,boolean boo) //构造函数,有3个参数,x,y,boo

{

this.x=x; //将参数赋给当前x

this.y=y; //将参数赋给当前y

有盘子=boo; //将boo赋给"有盘子"

}

public boolean 是否有盘子() //定义一个返回boolean类型的方法"是否有盘子"

{

return 有盘子; //返回boolean类型的"有盘子"

}

public void set有盘子(boolean boo) //set方法,并且参数为boolean

{

有盘子=boo; //将boo赋给有盘子

}

public int getX() //取得x方法

{

return x; //返回x

}

public int getY()//取得y方法

{

return y; //返回y

}

public void 放置盘子(Disk 盘子,HannoiTower con) //定义一个有2个参数的"放置盘子"方法。参数是Disk类和HannoiTower类

{

this.con=con; //当前con等于参数con

con.setLayout(null); //调用on对象的方法setLayout,并设置为空

this.盘子=盘子; //当前盘子等于参数盘子

con.add(盘子); //con对象的add方法,加入"盘子"对象

int w=盘子.getBounds().width; //定义并给一个int类型的w变量一个值,值为"盘子.getBounds().width"

int h=盘子.getBounds().height; //定义并给一个int类型的h变量一个值,值为"盘子.getBounds().height"

盘子.setBounds(x-w/2,y-h/2,w,h);//调用"盘子"对象的setBounds方法,并把传递值

有盘子=true;//boolean类型的对象"有盘子"等于true

con.validate(); //调用con对象的validate方法

}

public Disk 获取盘子() //定义"获取盘子"方法,方法返回Disk对象

{

return 盘子; //返回盘子

}

}

-----------------------另外说一下,楼主太抠门了!!!!!!!!只给5分-----------------------

求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环境下的四柱汉诺塔问题源代码

public class Tower {

/**

* 显示移动位置

*

* @param x

* @param Source

* @param Target

*/

void moveIt(int x, int Source, int Target) {

System.out.println("移动 [" + x + "] 从 " + Source + " 到 "

+ Target);

}

/**

*

* @param n

* 盘子数量

* @param First

* 第一根柱子

* @param Second

* 第二根柱子

* @param Third

* 第三根柱子

* @param Fourth

* 第四根柱子

* @return

*/

int MoveHanoi(int n, int First, int Second, int Third, int Fourth) {

if (n 1)

return 0; // 如果没有盘子就返回

if (n == 1) // 如果只有一个盘子

{

moveIt(n, First, Fourth); // 就直接从源柱子移到目标柱子上

return 0;

}

if (n == 2) // 如果有两个盘子

{

moveIt(n - 1, First, Second); // 把上面的那片移到一个过渡柱上

moveIt(n, First, Fourth); // 把下面的那片移到目标柱上

moveIt(n - 1, Second, Fourth); // 再把第 1 片从过渡柱移到目标柱上

return 0;

}

if (n == 3) // 如果有 3 片盘子

{

moveIt(n - 2, First, Second); // 把最小的盘子移到一个过渡柱上

moveIt(n - 1, First, Third); // 把中间盘子移到另一过渡柱上

moveIt(n, First, Fourth); // 把最大的盘子移到目标柱上

moveIt(n - 1, Third, Fourth); // 把中间盘子移到目标柱上

moveIt(n - 2, Second, Fourth); // 把最小的盘子移到目标柱上

return 0;

}

// 递归地把上面 n-2 盘子移到一个过渡柱上

// 留下最大的两个盘子

MoveHanoi(n - 2, First, Third, Fourth, Second);

moveIt(n - 1, First, Third); // 把倒数第 2 个盘子移到另一个过渡柱上

moveIt(n, First, Fourth); // 把最底下的盘子移到目标柱上

moveIt(n - 1, Third, Fourth); // 把倒数第 2 个盘子移到目标柱上

// 递归地把 n-2 个盘子从过渡柱上移到目标柱上

MoveHanoi(n - 2, Second, First, Third, Fourth);

return 0;

}

public static void main(String[] args) {

//4柱汉诺塔

new Tower().MoveHanoi(4, 1, 2, 3, 4);

}

}

求一个汉诺塔的JAVA代码

public class Hannoi {

public static void main(String[] args) {

int nDisks = 3;

moveDish(nDisks, 'A', 'B', 'C');

}

private static void moveDish(int level, char from, char inter, char to) {

if (level == 1) {

System.out.println("从" + from + "移动盘子 " + level + " 号到" + to);

} else {

moveDish(level - 1, from, to, inter);

System.out.println("从" + from + "移动盘子 " + level + " 号到" + to);

moveDish(level - 1, inter, from, to);

}

}

}


标题名称:三阶汉诺塔java源代码,java编写汉诺塔代码
标题网址:http://cqcxhl.com/article/dseecoo.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP