public?class?Hannoi?{
創(chuàng)新互聯(lián)專(zhuān)注于安遠(yuǎn)網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供安遠(yuǎn)營(yíng)銷(xiāo)型網(wǎng)站建設(shè),安遠(yuǎn)網(wǎng)站制作、安遠(yuǎn)網(wǎng)頁(yè)設(shè)計(jì)、安遠(yuǎn)網(wǎng)站官網(wǎng)定制、小程序開(kāi)發(fā)服務(wù),打造安遠(yuǎn)網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供安遠(yuǎn)網(wǎng)站排名全網(wǎng)營(yíng)銷(xiāo)落地服務(wù)。
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?+?"移動(dòng)盤(pán)子?"?+?level?+?"?號(hào)到"?+?to);
}?else?{
moveDish(level?-?1,?from,?to,?inter);
System.out.println("從"?+?from?+?"移動(dòng)盤(pán)子?"?+?level?+?"?號(hào)到"?+?to);
moveDish(level?-?1,?inter,?from,?to);
}
}
}
定義了服務(wù)器線(xiàn)程類(lèi),服務(wù)器運(yùn)行在一個(gè)單獨(dú)的線(xiàn)程中。
客戶(hù)端運(yùn)行在主線(xiàn)程中。
所有代碼放在一個(gè)源文件中就行。源文件名是Hanoi.java
下面是源代碼,輸入的盤(pán)子數(shù)不要太大,20以?xún)?nèi),否則會(huì)步數(shù)太多,輸出耗時(shí)太久。
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)?{
//創(chuàng)建服務(wù)器
HanoiServer?server?=?new?HanoiServer();
server.start();//啟動(dòng)服務(wù)器
/*開(kāi)始創(chuàng)建客戶(hù)端*/
Socket?socket?=?null;//客戶(hù)端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("請(qǐng)輸入盤(pán)子數(shù)(3-10),數(shù)字太大,運(yùn)算時(shí)間就會(huì)太長(zhǎng)可能會(huì)卡死。");
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("客戶(hù)端socket關(guān)閉");
}?catch?(IOException?e)?{
e.printStackTrace();
}
}
}
}
}
class?HanoiServer?extends?Thread?{//服務(wù)器線(xiàn)程類(lèi)
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("服務(wù)器socket關(guān)閉");
}?catch?(IOException?e)?{
e.printStackTrace();
}
}
try?{
this.serverSocket.close();
System.out.println("服務(wù)器serverSocket關(guān)閉");
}?catch?(IOException?e)?{
e.printStackTrace();
}
}
}
}
這樣應(yīng)該可以了
如果還有那個(gè)地方不懂的,建議你研究下漢諾塔算法
import
java.io.BufferedReader;//引入IO包中的BufferedReader
import
java.io.IOException;//引入IO包中的IO異常處理
import
java.io.InputStreamReader;//引入IO包中的InputStreaReader
public
class
Hinoi
{
//主類(lèi)
static
int
m=0;//定義移動(dòng)的次數(shù)
//主程序入口--main方法
public
static
void
main(String[]
args)
{
//創(chuàng)建BufferedReader對(duì)象,InputStream輸入流
BufferedReader
bf
=
new
BufferedReader(new
InputStreamReader(System.in));
System.out.println("請(qǐng)輸入盤(pán)子的個(gè)數(shù):");
try
{
int
sl
=
Integer.parseInt(bf.readLine().toString());//接收總盤(pán)子個(gè)數(shù)
toMove(sl,"A","B","C");//調(diào)用移動(dòng)方法
A--C
}
catch
(NumberFormatException
e)
{捕獲NumberFormatException異常
//
TODO
Auto-generated
catch
block
e.printStackTrace();//打印異常
}
catch
(IOException
e)
{//捕獲IOException異常
//
TODO
Auto-generated
catch
block
e.printStackTrace();//打印異常
}
System.out.println("總共移動(dòng)了:"+m+"
次數(shù)");//打印移動(dòng)次數(shù)
}
//移動(dòng)方法
private
static
void
toMove(int
sl,
String
one,
String
two,String
three)
{
if(sl==1){//如果只有一個(gè)盤(pán)子,則直接移動(dòng)到C柱
System.out.println("盤(pán)子"+sl+"
從
"+one+"----"+three);
}else{//如果總盤(pán)數(shù)大于1,則遞歸調(diào)用移動(dòng)方法
//把所有的數(shù)量為sl-1的盤(pán)子全部從A移到到B(C作為一個(gè)過(guò)渡),好提供一個(gè)最下面的位置給最大盤(pán)子到C;
toMove(sl-1,one,three,two);
System.out.println("盤(pán)子"+sl+"
從
"+one+"----"+three);
//把所有的剩余的盤(pán)子從B移動(dòng)到C(A作為一個(gè)過(guò)渡)
toMove(sl-1,two,one,three);
}
m++;
}
}
源代碼:
/**
*本程序完成的功能是利用漢遞規(guī)算法實(shí)現(xiàn)漢諾塔的動(dòng)態(tài)演示程序
*/
import javax.swing.*;
import java.awt.geom.*;
import java.awt.event.*;
import java.awt.*;
public class Hanio extends JApplet implements ActionListener, Runnable
{
/**
*diskNum是盤(pán)子的數(shù)量
*/
private int diskNum ;
/**
*各個(gè)組件的句柄
*/
private JButton begin, stop;
private JLabel lDiskNum;
private JTextField text;
JPanel pane;
/**
*定義一個(gè)線(xiàn)程句柄
*/
private Thread animate;
/**
*定義a,b,c三個(gè)柱子上是否有盤(pán)子,有哪些盤(pán)子
*/
private int adisk[];
private int bdisk[];
private int cdisk[];
public void init()
{
Container content = getContentPane();
content.setLayout(new BorderLayout());
lDiskNum = new JLabel(盤(pán)子的數(shù)目);
text = new JTextField(8);
begin = new JButton(開(kāi)始);
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)
{
/**
*消除以前畫(huà)的盤(pán)子
*/
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);//畫(huà)A組盤(pán)子
drawEllipse(g, 220, bdisk);//畫(huà)B組盤(pán)子
drawEllipse(g, 420, cdisk);//畫(huà)C組盤(pán)子
}
pane.repaint();?
}
public void update(Graphics g)
{
paint(g);
}
/**畫(huà)出橢圓代表盤(pán)子,g是圖形環(huán)境,x是最下面的盤(pán)子的橫坐標(biāo),
*arr是柱子數(shù)組
*/
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(開(kāi)始))
{
/**
*進(jìn)行初始化,開(kāi)始的時(shí)候只有a柱子上有盤(pán)子,其他柱子都沒(méi)有
*/
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())//創(chuàng)建一個(gè)線(xiàn)程
{
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;
}
}
/**
*線(xiàn)程方法,在此調(diào)用漢諾塔執(zhí)行移動(dòng)盤(pán)子操作
*/
public void run()
{
hanio(diskNum, 'A', 'B', 'C');
repaint();
}
/**
*漢諾塔遞規(guī)調(diào)用程序,n是盤(pán)子的數(shù)量,A,B,C分別代表三個(gè)柱子
*/
public void hanio(int n, char A, char B, char C)
{
if(n 1)
{
hanio(n-1, A, C, B);
pause();//停頓幾秒在執(zhí)行
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();
}
/**
*每隔半妙鐘移動(dòng)一個(gè)盤(pán)子
*/
public void pause()
{
try{
Thread.sleep(500);//可以修改此值加快盤(pán)子移動(dòng)的速度
}catch(InterruptedException e){}
}
}
標(biāo)題名稱(chēng):java漢羅塔代碼 python漢羅塔代碼
分享URL:http://muchs.cn/article44/docdshe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶(hù)體驗(yàn)、網(wǎng)站制作、網(wǎng)站策劃、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、建站公司、手機(jī)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)