当前位置:文档之家› 汉诺塔设计与实现

汉诺塔设计与实现

汉诺塔设计与实现
汉诺塔设计与实现

一、需求分析

(1)设计GUI界面的Hannoi塔。Hannoi塔中有三个座,名字分别为A、B和C。初始化状态是A做上有3个大小不等的盘子,这些盘子从座底到座顶按着大小顺

序依次摆放在A座。用户可以用鼠标选中盘子,然后通过拖动鼠标来移动该盘

子、释放鼠标来放置该盘子。

(2)程序要求用户在移动盘子过程中,不允许把大盘放置在小盘的上面,用户最终要完成的是把A座上的全部盘子移动到B座或者说C座上。

(3)用户可以通过Hannoi塔界面提供的菜单来选择初级、中级和高级三个级别。

初级级别的A座右3各大小不等的盘子、中级有4个而高级则有5个。

(4)用户可以通过单击Hannoi塔界面上提供的按钮,让程序自动完成A座上的盘子全部移动到C坐上。

(5)用户在移动盘子的过程中,可以随时单击Hannoi塔界面上的提供的按钮,重新开始当前的级别。

二、总体设计

在设计Hannoi塔时,需编写6个JAVA源文件:HannoiWindow.Java 、TowerPoint.java、Disc.java、HandleMous.java和AutoMoveDisc.java。

Hannoi塔除了要编写的6个Java源文件所给出的类外,还需要Java系统提供的一些重要的类,如JMenubar,JMenu,JMenuItem和JButton。Hannoi塔所用到得一些重要的类以及类之间的组合关系如图2.1所示:

图2.1 类之间的组合关系

分工:在本次课程设计中我和吴林剑作为一个团队设计一个汉诺塔,我主要负责主窗口的设计和相关各个函数之间的调用,吴林剑主要负责容器的设计。

以下是6个JAVA源文件的总体设计。

2.1 HannoiWindow.java(主类)

HannoiWindow类负责创建Hannoi塔的主窗口,该类含有main方法,Hannoi塔从该类开始执行。HannoiWindow类的成员变量中有五种重要类型的

对象,一个int基本型数据和一个char行数组。五种类型的对象分别是

JMenubar , JMenu,JMenuItem和JButton对象。

HannoiWindow类主要成员的作用将在后面的详细设计中阐述,HannoiWindow类创建的窗口以及其中的主要成员对象如图2.2所示:

图2.2HannoiWindow窗口及主要的成员对象

2.2 Tower.java

Tower类是javax.swing报中的JPanel容器的子类,创建的容器被添加到HannoiWindow窗口的中心。Tower类的成员变量中有四种重要的类型对象、一个int 基本型数据和一个char型数组。

2.3 Disc.java

Disc类是JButton的一个子类,创建的对象是Tower容器中的一个按钮,用来白傲视Tower中的“盘子”。

2.4 TowerPoint.java

TowerPint.Java类负责在Tower中创建表示位置的塔的对象。

2.5 HandleMouse.java

HandleMouse类创建的对象负责处理鼠标事件。

2.6 AutoMoveDisc.java

AutoMoveDisc类创建的对象负责走动移动盘子从一个座到另一个座。

三、详细设计

HannoiWindow类的详细设计

1.效果图

HannoiWindow创建的窗口效果如图3.1所示:

图3.1HannoiWindow创建的窗口

2. UML图

HannoiWindow类是javax.swing包中JFrame的一个子类,表明该类的主要成员变量的方法的UML图如3.2所示:

图3.2HannoiWindow类的UML图

以下是UML图中有关数据和方法的详细说明。

1)成员变量

1、Tower是Tower创建的对象Tower对象是一个容器,刻画了Hannoi塔的结构,

该对象被添加到窗口的中心。

2、anountOfDisc是int型数据,他的默认值是3。amountOfDisc的值用来确定

tower对象中“盘子”的数目,即Disc对象的数目。

3、towerName是char型数组,长度为3,其中三个单元的默认值一次是A、B和

C。towerName数组的单元的值用来确定tower中三座的名字。

4、bar是JMenuBar创建的菜单条用来添加菜单。Bar被放置的在窗口的顶部。

5、menuGrade是JMenu创建的菜单没起名字为“选择级别”。menuGrade被添加到

菜单条bar中。

6、renew和autoButton是JBotton创建的按钮对象,名字一次为“重新开始”

和“自动演示”Renew和autoButton都将当前窗口注册为自己的ActionEvent

时间监视器。

2)方法

1、HannoiWindow()是构造方法,负责完成窗口的初始化。

2、Main方法是Hannoi塔程序运行的入口方法。

3、actionPerformed方法是HannoiWindow类实现的ActionListener接口中的方

法。HannoiWindow创建的窗口时oneGradeItem、twoGradeItem和

threeGradeItemsave三个菜单项以及renew和autoButton两个按钮的

ActionEvent时间监视器。当用户选中某个菜单项或单击按钮时,窗口执行

actionPerformed方法进行相应的操作。如果用户选中oneGradeItem、

twoGradeItem和threeGradeItemsave三个菜单项的某一项时,

actionPerformed方法所执行的操作就是改变amountOfDisc的值,并让tower

对象根据amountOfDisc设置其初始状态。当用户单击renew按钮是,

actionPerformed方法所进行的操作是保持当前amountOfDisc的值,并让

tower对象根据amoutOfDisc的值设置起初始状态。当用户单击aotoButton

按钮时,actionPerformed方法是让tower对象返回其中的AutoMoveDisc对

象,该对象是一个对话框,用户可以通过该对话框让程序自动的移动“盘子”。3)代码(HannoiWindow.java)

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();

}

}

四、运行结果

初始界面:

自动演示界面:

选择难度级别界面:

五、实验总结

通过本次课程设计我能熟练地运用JAVA里面的容器进行设计。对汉诺塔的逻辑设计也有了深刻的理解。

六、附录

///////////////HannoiWindow类

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();

}

}

////// AutoMoveDisc

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';

}

else

towerName=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

if(pointA[i].isHaveDisc()==true){

disc=pointA[i].getDiscOnPoint();

pointA[i].setHaveDisc(false);

break;

}

}

}

if(cStart==towerName[1]){

for(int i=0;i

if(pointB[i].isHaveDisc()==true){

disc=pointB[i].getDiscOnPoint();

pointB[i].setHaveDisc(false);

break;

}

}

}

if(cStart==towerName[2]){

for(int i=0;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

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

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

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);

}

}

}

//////////Disc类

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;

}

}

/////////// HandleMouse

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

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

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

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

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

&&endPoint.isHaveDisc()==false

&&pointA[i+1].getDiscOnPoint().getNumber() >disc.getNumber()){

location=true;

break;

}

}

}

for(int i=0;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

&&endPoint.isHaveDisc()==false

&&pointB[i+1].getDiscOnPoint().getNumber() >disc.getNumber()){

location=true;

break;

}

}

}

for(int i=0;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

&&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);

}

else

startPoint.putDisc(disc,con);

}

public void mouseEntered(MouseEvent e){}

public void mouseExited(MouseEvent e){}

public void mouseClicked(MouseEvent e){}

}

///// Tower

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;

else

amountOfDisc=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(){

int n=(maxDiscWidth-minDiscWidth)/amountOfDisc;

disc=new Disc[amountOfDisc];

for(int i=0;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(int i=0;i

pointA[i]=new

TowerPoint(maxDiscWidth,100+vertialDistance);

vertialDistance=vertialDistance+discHeight;

}

vertialDistance=discHeight;

for(int i=0;i

pointB[i]=new

TowerPoint(2*maxDiscWidth,100+vertialDistance);

vertialDistance=vertialDistance+discHeight;

}

vertialDistance=discHeight;

for(int i=0;i

pointC[i]=new

TowerPoint(3*maxDiscWidth,100+vertialDistance);

vertialDistance=vertialDistance+discHeight;

}

for(int i=0;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);

汉诺塔问题的三种实现

// test_project.cpp : 定义控制台应用程序的入口点。//汉诺塔问题的 // //递归实现 /*#include "stdafx.h" #include using namespace std; int count=0;//记录移动到了多少步 void Move(int n,char From,char To); void Hannoi(int n,char From, char Pass ,char To); //把圆盘从From,经过pass,移动到To int main() { int n_count=0; cout<<"请输入圆盘个数:"; cin>>n_count; Hannoi(n_count,'A','B','C'); } void Move(int n,char From,char To)

{ count++; cout<<"第"<

/*后来一位美国学者发现一种出人意料的简单方法,只要轮流进行两步操作就可以了。首先把三根柱子按顺序排成品字型,把所有的圆盘按从大到小的顺序放在柱子A上,根据圆盘的数量确定柱子的排放顺序:若n为偶数,按顺时针方向依次摆放A B C; 若n为奇数,按顺时针方向依次摆放A C B。 ()按顺时针方向把圆盘从现在的柱子移动到下一根柱子,即当n为偶数时,若圆盘在柱子A,则把它移动到B;若圆盘在柱子B,则把它移动到C;若圆盘在柱子C,则把它移动到A。 ()接着,把另外两根柱子上可以移动的圆盘移动到新的柱子上。即把非空柱子上的圆盘移动到空柱子上,当两根柱子都非空时,移动较小的圆盘。这一步没有明确规定移动哪个圆盘,你可能以为会有多种可能性,其实不然,可实施的行动是唯一的。 ()反复进行()()操作,最后就能按规定完成汉诺塔的移动。 所以结果非常简单,就是按照移动规则向一个方向移动金片: 如阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C 汉诺塔问题也是程序设计中的经典递归问题,下面我们将给出递归和非递归的不同实现源代码。*/ /*#include "stdafx.h" #include #include

07141326汉诺塔-课程设计

汉诺塔课程设计 报告 目录 一、需求分析 (3) 二、概要设计 (4) 三、详细设计 (6) 四、测试与分析 (7) 五、总结 (7)

六、附录:源程序清单 (8) 一、需求分析 1.1问题描述 汉诺塔(又称河内塔)问题是印度的一个古老的传说。开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。 这是一个著名的问题,几乎所有的教材上都有这个问题。由于条件是一次只能移动一个盘,且不允许大盘放在小盘上面,所以64个盘的移动次数是:

18,446,744,073,709,551,615 这是一个天文数字,若每一微秒可能计算(并不输出)一次移动,那么也需要几乎一百万年。我们仅能找出问题的解决方法并解决较小N值时的汉诺塔,但很难用计算机解决64层的汉诺塔。 后来,这个传说就演变为汉诺塔游戏: 1.有三根杆子A,B,C。A杆上有若干圆盘 2.每次移动一块圆盘,小的只能叠在大的上面 3.把所有圆盘从A杆全部移到C杆上 经过研究发现,汉诺塔的破解很简单,就是按照移动规则向一个方向移动圆盘:如3阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C 此外,汉诺塔问题也是程序设计中的经典递归问题。 将n个盘子从a座移动到c座可以分解为以下3个步骤: (1)将a上n-1个盘借助c座先移到b座上。 (2)把a座剩下的一个盘移到c座上。 (3)将n-1个盘从c座借助于a座移到c座上。 1.2基本要求 (1)输入的形式和输入值的范围: 输入圆盘的数量,类型为整型,大于零。 (2)输出的形式: 运行结果为用字母表示移动盘子的方案,而并非是真正移动盘子。 (3) 程序所能达到的功能; 输入圆盘数量为定值时的移盘方案。帮助我们更清晰的理解汉诺塔问题,及递归调用的应用。 二、概要设计 分析问题,找出移动圆盘的正确算法。 将n个盘子从a座移动到c座可以分解为以下3个步骤: (1)将a上n-1个盘借助c座先移到b座上。 (2)把a座剩下的一个盘移到c座上。 (3)将n-1个盘从c座借助于a座移到c座上。

汉诺塔课程设计

汉诺塔课程设计 一、教学内容: 1、了解汉诺塔的历史。 2、讲解汉诺塔的游戏规则。 二、课程设计目的: 1、让伙伴们了解汉诺塔的历史,勾起孩子们的学习兴趣,让伙伴们更加热爱数学。 2、在掌握汉诺塔玩法的基础上,锻炼伙伴们的观察力,变通里,和右脑开发。 3、增强伙伴们的空间想象能力和动手能力。 4、让伙伴们体会到数学的神奇,从而对数学产生更加浓厚的兴趣。 三、培养技能:观察力、想象力、变通里、右脑开发。 四、所需工具:汉诺塔、记号笔。 五、教学流程概述: 第一节课:1、讲一个关于汉诺塔的故事。2、带领伙伴们一起观察和了解汉诺塔的游戏规则。(以三盘为例说明)(30分钟) 第二节课:汉诺塔4盘的移法。(30分钟) 第三节课:汉诺塔5盘的移法。(30分钟) 第四节课: 汉诺塔月底考核。(30分钟) 六、教学流程详细解读: 第一节课:让伙伴们了解汉诺塔的历史,勾起孩子们的学习 兴趣,让伙伴们更加热爱数学。 1、讲关于汉诺塔的故事: 在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄 铜板上插着三根宝石针。印度教的主神梵天在创造世界的时 候,在其中一根针上从下到上地穿好了由大到小的64片金 片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在 按照下面的法则移动这些金片:一次只移动一片,不管在哪 根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移

、告诉伙伴们游戏规则: 以三个环为例说明: (一)先让伙伴们自己观察有几个柱子,有几个盘,并且盘是怎么排列的? 答:有三根相邻的柱子,第一根柱子上从下到上放着3个不同大小的圆盘,并且顺序是由大到小依次叠放。 (二)分别为这3个相邻的柱子编号A柱、B柱、C柱;在为这3个圆盘编号盘1、盘2、盘3。 让伙伴们自己动脑想想:如何要把A柱上的3个盘子一个一个移动到C柱上,并且每次移动同一根柱子上都必须保持大点的盘子在下,小点的盘子在上。最后也要使移动到C 柱的圆盘从下到上按照盘3,2,1金字塔的形状排列。 (三)带领伙伴们一起动手操作: (1)、盘1移动到C柱。 (2)、盘2移动到B柱。 (3)、盘1在移动到B柱上,这时盘1在盘2上。 (4)、盘3移动到C柱上。 (5)、再将盘1移动到A柱,这时B柱就只剩盘2。 (6)、将盘2移动到C柱,在盘3上边。 (7)、再将盘1移动到C柱,这时就成功了。 (四)鼓励伙伴们再来一次,按照刚才的移动方法 将C柱的圆盘移动到A柱。 (五)等所有伙伴都移动成功都移动成功后,引导伙伴们仔细思考,看看各位伙伴在移动的过程中有发现什么规律和技巧没有? 带领伙伴再来熟悉一遍: 第一步:盘1移动到C柱;第二步:盘2移动到B柱;......第四步:盘3移动到C柱上......

汉诺塔非递归算法C语言实现

汉诺塔非递归算法C语言实现 #include #include #define CSZL 10 #define FPZL 10 typedef struct hanoi { int n; char x,y,z; }hanoi; typedef struct Stack { hanoi *base,*top; int stacksize; }Stack; int InitStack(Stack *S) { S->base=(hanoi *)malloc(CSZL*sizeof(hanoi)); if(!S->base) return 0; S->top=S->base; S->stacksize=CSZL; return 1; } int PushStack(Stack *S,int n,char x,char y,char z) { if(S->top-S->base==S->stacksize) { S->base=(hanoi *)realloc(S->base,(S->stacksize+FPZL)*sizeof(hanoi)); if(!S->base) return 0; S->top=S->base+S->stacksize; S->stacksize+=FPZL; } S->top->n=n; S->top->x=x; S->top->y=y; S->top->z=z; S->top++; return 1; } int PopStack(Stack *S,int *n,char *x,char *y,char *z) { if(S->top==S->base)

java,汉诺塔,课程设计,心得体会

java,汉诺塔,课程设计,心得体会 篇一:基于JAVA汉诺塔游戏设计与实现 基于JAVA汉诺塔游戏设计与实现 院系:计算机与电子系 专业班:计算机应用技术0902班 姓名:高亚 学号:XX2911057 指导教师:彭文艺 XX 年6月 基于JAVA汉诺塔游戏设计与实现 JAVA Tower of Hanoi-based Game Design and Implementation 摘要 Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaSE, JavaEE, JavaME)的总称。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。 随着时代的不断发展进步,计算机已经融入我们的日

常生活。很多时候,很多的问题想通过人的手来亲自解决已变得十分困难了,这时我们就要运用计算机来帮我们解决这些复杂的问题,汉诺塔问题就是这类较复杂的问题。 此次,我们通过Eclipse软件来解决汉诺塔问题。程序运行后会出现一个界面,界面上有各种操作提示,按照提示进行各种操作后会得到汉诺塔游戏的运行过程及结果。 关键词: Java 汉诺塔 Eclipse Abstract Java is a cross-platform application software can write object-oriented programming language by Sun Microsystems, Inc. in May 1995 launch of the Java programming language and the Java platform (namely JavaSE, JavaEE, of JavaME) the general excellent versatility, efficiency, platform portability, and security of Java technology, widely used in personal PC, the data center, game consoles, scientific supercomputers, mobile phones and the Internet, while the world's largest developer of professional community. Global cloud computing and mobile Internet industry environment, Java has significant advantages and broad prospects. With the continual development and progress, the

用VB设计汉诺塔动画游戏

本栏目责任编辑:谢媛媛软件设计开发Computer Knowledge and Technology 电脑知识 与技术第5卷第30期(2009年10月)用VB 设计汉诺塔动画游戏 刘德强 (无锡职业技术学院,江苏无锡214024) 摘要:汉诺塔问题是程序设计教学中关于递归调用的经典案例。该文介绍了用VB 设计汉诺塔动画游戏程序的基本过程,其中重点介绍了用VB 的自定义数据类型和图形处理技术设计游戏步点状态记录和动画效果的方法。 关键词:VB ;汉诺塔;动画 中图分类号:TP311文献标识码:A 文章编号:1009-3044(2009)30-8460-03 The Designing of Hanoi Towers Animation Game by VB LIU De-qiang (Wuxi Institute of Technology,Wuxi 214024,China) Abstract:The Hanoi Towers is a typical case of recursive calls in programming teaching.This paper introduces the basic process of design -ing Hanoi Towers animation game by VB,focuses on recording game state between two steps and designing animation by self-defined data type and graph skill in VB. Key Words:VB;Hanoi;animation 汉诺塔问题源自印度的一个古老传说,传至现代演变成了汉诺塔游戏:有A 、B 、C 三个垂直杆和若干个大小各不相同的圆片。开始时圆片全部套在A 杆上,且从下至上圆片大小依次递减。要求借助B 杆,将圆片全部移到C 杆上,每次只能移动一片,并且整个过程中三个杆上的圆片都必须保持大的在下小的在上。游戏的难度由开始时放置在A 杆上圆片的个数进行控制。 1游戏步点状态记录设计 笔者设计的汉诺塔游戏程序主要包括演示和游戏两方面的功能。演示功能实现的是根据汉诺塔问题算法预先计算出的圆片移动顺序由计算机自行对圆片进行移动;而游戏功能是指计算机通过人机交互界面根据游戏者的实时操作顺序进行圆片的移动。图1是程序运行时界面。无论是演示还是游戏,计算机执行的基本动作元素是相同的,即圆片从一个杆上移动到另一个杆上,这一过程体现在程序设计中就是在新的位置对圆片图形进行重画,它与每个杆的步点状态密切相关。 步点状态是指每完成一步操作以后,开始下一步操作之前,一个杆上 的圆片数量及各圆片的位置和大小等多个特征综合构成的状态,是多个 数据的集合。将开始时圆片数记为n ,从初始状态圆片都在A 杆上,到终 止状态n 个圆片移到C 杆上,其间每次移动圆片,各杆的步点状态都会 发生变化。游戏进程中“记”住各杆的当前步点状态,是实现不断移动圆片 的关键。以要移动A 杆上的一个圆片到B 杆为例:要判断圆片根据规则 是否可以移动及圆片移动后放置在B 杆的什么位置(y 坐标),就必须知 道当前B 杆上最上端圆片的大小和B 杆上当前圆片数量,即B 杆的当前 步点状态。综合以上分析,游戏步点状态记录是程序设计中的要点。 鉴于描述步点状态需要多个数据,且数据间相互关联并构成整体,笔 者在设计中采用了自定义数据类型的方法,数据类型名称为circles ,所含 内容和定义格式如下: Type circles counts As integer r()As integer x As integer y()As integer End Type circles 类型中,数据成员counts 用于记录杆上实际圆片数,r 用于记录各圆片的半径,x 记录各圆片圆心的x 坐标,y 记录各圆片圆心的y 坐标。因为每次游戏设置的初始圆片数是不确定的且游戏进程中各杆都可能出现多个圆片,所以数据成员r 和y 定义为动态数组。 数据类型circles 定义以后,先使用该类型定义三个实例a 、b 、c ,分别代表A 、B 、C 三个杆的步点状态。语句如下: Dim a As circles ,b As circles ,c As circles 当初始圆片数量确定后(记为n),可使用下列语句对A 杆的步点状态a 进行初始化。 投稿日期:2009-08-22 作者简介:刘德强(1965-),江苏靖江人,无锡职业技术学院讲师。 图1运行界面ISSN 1009-3044Computer Knowledge and Technology 电脑知识与技术Vol.5,No.30,October 2009,pp.8460-8462E-mail:xsjl@https://www.doczj.com/doc/9213643859.html, https://www.doczj.com/doc/9213643859.html, Tel:+86-551-569096356909648460

数据结构实验报告汉诺塔

实验报告书 课程名:数据结构 题目:汉诺塔 班级: 学号: 姓名: 评语: 成绩:指导教师: 批阅时间:年月日

一、目的与要求 1)掌握栈与队列的数据类型描述及特点; 2)熟练掌握栈的顺序和链式存储存表示与基本算法的实现; 3)掌握队列的链式存储表示与基本操作算法实现; 4) 掌握栈与队列在实际问题中的应用和基本编程技巧; 4)按照实验题目要求独立正确地完成实验内容(提交程序清单及相关实验数据与运行结果); 5)认真书写实验报告,并按时提交。 二、实验内容或题目 汉诺塔问题。程序结果:给出程序执行过程中栈的变化过程与圆盘的搬动状态。 三、实验步骤与源程序 源程序: / *编译环境Visual C++6.0 */ #include "stdafx.h" #include #include void move(int h,char c,char f) { printf("%d:%c--->%c\n",h,c,f); } void hanoi(int n,char x,char y,char z) { if(n==1) move(1,x,z); else { hanoi(n-1,x,z,y); move(n,x,z); hanoi(n-1,y,x,z); } } void main(void) { int flag; do { printf(" 汉诺塔问题\n\n"); printf("[1] 开始\n"); printf("[2] 退出\n"); printf("1--2请选择:"); scanf("%d",&flag); printf("\n"); switch(flag) { case 1:

基于JAVA汉诺塔游戏设计与实现

基于JAVA汉诺塔游戏设计与实现 院系:计算机与电子系 专业班:计算机应用技术0902班 姓名:高亚 学号:20092911057 指导教师:彭文艺 2012 年6月

基于JAVA汉诺塔游戏设计与实现JA V A Tower of Hanoi-based Game Design and Implementation

摘要 Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaSE, JavaEE, JavaME)的总称。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。 随着时代的不断发展进步,计算机已经融入我们的日常生活。很多时候,很多的问题想通过人的手来亲自解决已变得十分困难了,这时我们就要运用计算机来帮我们解决这些复杂的问题,汉诺塔问题就是这类较复杂的问题。 此次,我们通过Eclipse软件来解决汉诺塔问题。程序运行后会出现一个界面,界面上有各种操作提示,按照提示进行各种操作后会得到汉诺塔游戏的运行过程及结果。 关键词:Java汉诺塔Eclipse

Abstract Java is a cross-platform application software can write object-oriented programming language by Sun Microsystems, Inc. in May 1995 launch of the Java programming language and the Java platform (namely JavaSE, JavaEE, of JavaME) the general term.Has excellent versatility, efficiency, platform portability, and security of Java technology, widely used in personal PC, the data center, game consoles, scientific supercomputers, mobile phones and the Internet, while the world's largest developer of professional community. Global cloud computing and mobile Internet industry environment, Java has significant advantages and broad prospects. With the continual development and progress, the computer has been integrated into our daily lives. In many cases, a lot of problems to think through the human hand to personally resolve the very difficult, then we will use the computer to help us solve these complex issues. The Tower of Hanoi problem is that these more complex problems. The Eclipse software to solve the Tower of Hanoi problem. After running a single interface, the interface on a variety of operating tips, follow the prompts to perform various operations will be the running process and the outcome of the Tower of Hanoi game. Key words: Java Tower of Hanoi Eclipse

汉诺塔问题实验报告

1.实验目的: 通过本实验,掌握复杂性问题的分析方法,了解汉诺塔游戏的时间复杂性和空间复杂性。 2.问题描述: 汉诺塔问题来自一个古老的传说:在世界刚被创建的时候有一座钻石宝塔(塔A),其上有64个金碟。所有碟子按从大到小的次序从塔底堆放至塔顶。紧挨着这座塔有另外两个钻石宝塔(塔B和塔C)。从世界创始之日起,婆罗门的牧师们就一直在试图把塔A 上的碟子移动到塔C上去,其间借助于塔B的帮助。每次只能移动一个碟子,任何时候都不能把一个碟子放在比它小的碟子上面。当牧师们完成任务时,世界末日也就到了。 3.算法设计思想: 对于汉诺塔问题的求解,可以通过以下三个步骤实现: (1)将塔A上的n-1个碟子借助塔C先移到塔B上。 (2)把塔A上剩下的一个碟子移到塔C上。 (3)将n-1个碟子从塔B借助于塔A移到塔C上。 4.实验步骤: 1.用c++ 或c语言设计实现汉诺塔游戏; 2.让盘子数从2 开始到7进行实验,记录程序运行时间和递 归调用次数; 3.画出盘子数n和运行时间t 、递归调用次数m的关系图, 并进行分析。 5.代码设计: Hanio.cpp #include"stdafx.h" #include #include #include void hanoi(int n,char x,char y,char z) { if(n==1) { printf("从%c->搬到%c\n",x,z); } else { hanoi(n-1,x,z,y); printf("从%c->%c搬到\n",x,z); hanoi(n-1,y,x,z); }

汉诺塔课程设计

攀枝花学院课程设计 题目:汉诺塔演示程序设计院(系): 年级专业: 姓名: 学号: 指导教师: 二〇〇九年十二月十四日 攀枝花学院教务处制

攀枝花学院本科学生课程设计任务书 注:任务书由指导教师填写。

课程设计(论文)指导教师成绩评定表

摘要 汉诺塔(又称河内塔)问题是一个古典的数学问题,是一个用递归方法解题的典型例子。问题是这样的:开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。 利用计算机图形学进行汉诺塔演示程序设计,是利用C语言绘图函数实现汉诺塔的递归算法图形界面演示过程。通过C语言实现图形学的绘图,程序控制,以及区域填充,并根据汉诺塔的算法原理实现大小不同的盘子移动的全过程演示。 关键词汉诺塔,变换矩阵,种子填充算法,递归调用

目录 摘要 .......................................................................................................................................... I 1 需求分析 (1) 1.1 需求概述 (1) 1.2 需求环境 (1) 1.3 功能描述 (2) 2 概要设计 (3) 2.1 程序功能模块 (3) 2.2 程序流程图 (3) 2.3 数据结构的设计 (4) 3 详细设计 (5) 3.1 程序初始化 (5) 3.1.1 代码功能 (5) 3.1.2 功能实现代码 (5) 3.2 盘块的移动过程 (5) 3.2.1代码功能 (5) 3.2.2 功能实现代码 (5) 3.3 递归函数 (6) 3.3.1 流程图 (6) 3.3.2 功能实现代码 (7) 4 测试与运行 (8) 结束语 (9) 参考文献 (10)

校本课程《汉诺塔游戏》【教学设计】.doc

《汉诺塔游戏》教学设计 学习内容:数学游戏“汉诺塔”第一课时 学习目标: 1.了解汉诺塔游戏的传说以及汉诺塔游戏的基本规则。 2.经历汉诺塔游戏的游玩过程,在“玩”中掌握汉诺塔游戏的基本规则,初步发现游戏中的规律。 3.在收集信息、整理归纳、猜测验证的数学思维过程,发展归纳推理能力和逻辑思维能力。 4.在解决问题的过程中,体会与他人合作获得更多的成功体验。 学习重点: 经历汉诺塔游戏的游玩过程,在“玩”中掌握汉诺塔游戏的基本规则初步发现游戏中的规律。 学习难点: 在收集信息、整理归纳、猜测验证的数学思维过程,发展归纳推理能力和逻辑思维能力。

学习过程: 课前活动 大家喜欢玩游戏么?玩过什么游戏? 我为大家带来一位游戏高手,一起来认识一下。播放录像。这 只黑猩猩聪明吧?它的表现太神奇了!你知道它玩的什么? 板书课题:汉诺塔 接下来,就让我们一起步入汉诺塔游戏的世界。 一、认识汉诺塔 1.关于汉诺塔,你想了解些什么?(规则,来历,玩法……) 同学们的问题太棒了!相信上完了这节课,能解决你的许多问题! 咱们就从汉诺塔的来历说起。Ppt 播放相关介绍。 2.认识汉诺塔各部分。 到了现代,汉诺塔演变成了这个样子。出示教具。 咱们一起来认识一下汉诺塔:下面是一个托盘,上面竖着3 根柱子,从左到右依次为A 柱、B 柱、C 柱。A 柱是起始柱,游戏开始的时候所有的圆片摆放的位置;C 柱是目标柱,游戏结束时,所有的金片都按照顺

序排列在上面;B 柱是中转柱。 3.了解游戏规则。 大家想不想看一看,老师玩汉诺塔游戏的录像?请你一边看一边想:汉诺塔游戏的规则是什么?出示录像。 谁来说一说,汉诺塔游戏的规则是什么? (1)从一边到另一边板书:1.从A 到C (2)一次只能移动一个金片板书:2.一次一片 (3)大金片不能放到小金片的上面板书:3.大不压小 二、动手实践玩游戏 知道了规则,接下来,咱们就开始玩汉诺塔的游戏吧。 1.咱们从1 个圆片开始研究。 请你拿出学具,在A 柱上摆放1 个圆片。其它圆片放在旁边桌上。 1 个圆片,可以怎么玩?动手试一试。说一说。 生1:可以从A 直接到C,移动一次。生 2:可以从A 到B 再到C,移动两次。 两种方法都可以。我们来看规则:从A 到C,如果可以直接一步到

汉诺塔课程设计报告

汉诺塔游戏 学院:理学院 班级:信科102班 组长:李万东 组员1:袁雪娇 组员2:张瑜 设计期限2012 年3月1开始 至2012年6月20 结束 课程设计题目:汉诺塔游戏 课程设计目的: 《JA V A程序设计》是计算机相关专业的必修专业基础课程,其实践性、应用性很强。实践教学环节是必不可少的一个重要环节。本课程的程序设计专题实际是计算机相关专业学生学习完《JA V A程序设计》课程后,进行的一次全面的综合训练,JA V A程序设计的设计目的是加深对理论教学内容的理解和掌握,使学生较系统地掌握程序设计及其在网络开发中的广泛应用,基本方法及技巧,为学生综合运用所学知识,利用软件工程为基础进行软件开发、并在实践应用方面打下一定基础。 随着社会的进步,我们用来娱乐的游戏世界也越来越丰富,越来越复杂。本程序的汉诺塔游戏不但包括了游戏最基本的功能,而且还能培养用户的逻辑思维能力,同时也给玩家提供了一定的娱乐空间。本游戏还包括一个自动演示搬移汉诺塔的功能,此功能能够帮助初次接触此游戏的用户了解此游戏的玩法。 课程设计理论: 本程序要求实现用图形界面,画出3个杆和若干个大小不一的矩形盘子,形成3个塔,分别为A塔,B塔,C塔,同时盘子数目可以人工设定。用户可以用鼠标选中盘子,然后通过拖动鼠标来移动该盘子、释放鼠标来放置该盘子。用户在移动盘子的过程中,可以随时单击汉诺塔菜单栏的菜单中提供的按钮,重新开 1格式已调整,word版本可编辑.

始游戏,并且可以通过单击汉诺塔菜单栏的菜单提供的按钮,让程序自动完成把A塔上的盘子全部移动到C塔上,实现自动演示。 汉诺塔算法属于递归算法,该算法过程为: 假定要把n个盘子按题目规定由A杆借助B杆移动到C杆。 第一步:先把上面的n-1个盘子借助C杆放到B杆。 第二步:把第n个盘子从A杆直接移到C杆。 第三步:把B杆上的n-1个盘子借助A杆移到B杆。 概要设计: 1.课程设计内容: 有三个表示塔的对象,分别命名为A、B和C。A塔上有若干个盘子,盘子的大小不等,并按着大小顺序依次摆放在A塔上,大盘在下,小盘在上。用户可以用鼠标拖动盘子,把A塔上的盘子全部移动到另外两个塔中的任何一个塔上。要求每次只能移动一个盘子,在任何时候不允许大盘压在小盘的上面。用户也可以选择让程序自动演示。选择自动演示后,程序将以动画形式演示把A塔上的盘子全部移到C塔的过程。 2.课程设计功能: (1)设计GUI界面的汉诺塔。汉诺塔中有三个座,名字分别是A、B和C。初始状态是A座上有四个大小不等的盘子,这些盘子从座底到座顶按着大小顺序依次摆放在A座上。用户可以用鼠标选中盘子,然后通过拖动鼠标来移动该盘子、释放鼠标来放置该盘子。 (2)程序要求用户在移动盘子过程中,不允许把大盘子放在小盘子的上面,用户最终要完成的是把A座上的全部盘子移动到B座或C座上。 (3)用户可以通过单击汉诺塔菜单栏的菜单提供的按钮,让程序自动完成把A座上的盘子全部移动到B座或C座上。 (4)用户在移动盘子的过程中,可以随时单击汉诺塔菜单栏的菜单提供的按钮,重新开始游戏。 3. 2.

汉诺塔问题的非递归算法分析

汉诺塔递归与非递归算法研究 作者1,作者2,作者33 (陕西师范大学计算机科学学院,陕西西安 710062) 摘要: 摘要内容(包括目的、方法、结果和结论四要素) 摘要又称概要,内容提要.摘要是以提供文献内容梗概为目的,不加评论和补充解释,简明,确切地记述文献重要内容的短文.其基本要素包括研究目的,方法,结果和结论.具体地讲就是研究工作的主要对象和范围,采用的手段和方法,得出的结果和重要的结论,有时也包括具有情报价值的其它重要的信息.摘要应具有独立性和自明性,并且拥有与文献同等量的主要信息,即不阅读全文,就能获得必要的信息. 关键词:关键词1; 关键词2;关键词3;……(一般可选3~8个关键词,用中文表示,不用英文 Title 如:XIN Ming-ming , XIN Ming (1.Dept. of ****, University, City Province Zip C ode, China;2.Dept. of ****, University, City Province Zip C ode, China;3.Dept. of ****, University, City Province Zip C ode, China) Abstract: abstract(第三人称叙述,尽量使用简单句;介绍作者工作(目的、方法、结果)用过去时,简述作者结论用一般现在时) Key words: keyword1;keyword2; keyword3;……(与中文关键词对应,字母小写(缩略词除外)); 正文部分用小5号宋体字,分两栏排,其中图表宽度不超过8cm.。设置为A4页面 1 引言(一级标题四号黑体加粗) 这个问题当时老和尚和众僧们,经过计算后,预言当所有的盘子都从基柱A移到基座B上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。其实,不管这个传说的可信度有多大,如果考虑把64个盘子,由一个塔柱上移到另一根塔柱上,并且始终保持上小下大的顺序。假设有n个盘子,移动次数是f(n).显然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1。此后不难证明f(n)=2n-1。n=64时, f(64)= 2^64-1=18446744073709551615 假如每秒钟一次,共需多长时间呢?一年大约有 31536926 秒,计算表明移完这些金片需要5800多亿年,比地球寿命还要长,事实上,世界、梵塔、庙宇和众生都早已经灰飞烟灭。 对传统的汉诺塔问题,目前还有不少的学者继续研究它的非递归解法,本文通过对递归算法的研究……. 提示:(1)可以定义问题的规模n,如盘子的数量;(2)塔柱的数量(目前有部分理论可以支撑,不妨用计算机实现)分析规模的变化与算法的复杂度比较。(3)可以对经典的汉诺塔问题条件放松、加宽,如在经典的汉诺塔问题中大盘只能在小盘下面,放松其他条件可以定义相邻两个盘子必须满足大盘只能在小盘下面。其它盘子不作要求。 2 算法设计 2.1 汉诺塔递归算法描述(二级标题小五黑体加粗) 用人类的大脑直接去解3,4或5个盘子的汉诺塔问题还可以,但是随着盘子个数的增多,问题的规模变的越来越大。这样的问题就难以完成,更不用说吧问题抽象成循环的机器操作。所以类似的问题可用递归算法来求解。下面n个盘的汉

汉诺塔课程设计

学 号: 200840420149 课 程 设 计 题 目 汉诺塔 教 学 院 计算机学院 专 业 计算机 班 级 网络技术 姓 名 指导教师 2010 年 12 月 17 日

课程设计任务书 2009 ~2010 学年第一学期 学生姓名:专业班级:网络技术 指导教师:工作部门:计算机学院 一、课程设计题目 汉诺威塔 二、课程设计内容(含技术指标) 1.在移动盘子的每一步骤,形象直观地显示各针上的盘子。 2.考虑到学“VC 语言”课程的学生同时学习了“数据结构”课程,所以用灵活的数据结构解决汉诺威塔问题,灵活的处理数据结构中的经典问题。 3.使用VC++,因用面向对象的方法去处理数据结构已经是当今的潮流。 三、进度安排 1. 初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数; 2. 完成最低要求:实现5层汉诺威塔的调整过程; 3.进一步要求:直至实现n=9时的情况。 四、基本要求 1.界面友好,函数功能要划分好 2.总体设计应画流程图 3.程序要加必要的注释 4.要提供程序测试方案 5.程序一定要经得起测试,宁可功能少一些,也要能运行起来。 教研室主任签名: 2010年12 月 17 日

目录 1、概述 (3) 2、设计目的 (4) 3、问题分析 (4) 4、逻辑设计 (5) 5、流程图 (5) 6、程序代码: (6) 7、程序调试与测试 (9) 8、结果分析 (12) 9、总结 (13) 一、概述 数据结构是计算机学科非常重要的一门专业基础理论课程,要想编写针对非数值计算问题的高质量程序,就必须要熟练的掌握这门课程设计的知识。另外,他与计算机其他课程都有密切联系,具有独特的承上启下的重要位置。拥有《数据结构》这门课程的知识准备,对于学习计算机专业的其他课程,如操作系统、数据库管理系统、软件工程的都是有益的。

汉诺塔游戏设计过程

兰州交通大学 数理与软件工程学院 课程设计报告 2011 ~2012学年第二学期 课程名称数据结构 设计题目汉诺塔游戏程序 班级信计1001班 小组成员张章、王欣、李贵生 报告者李贵生201005235 指导老师金静 2012年6月

一、实验目的: 通过此次C++实训,一方面加深了对C++语言的了解,而不只是单单的在课本中学到的那些理论。通过学生动手亲自编写,平时乏味的课程,变的生动有趣。平时在课堂上学到的东西可以自己动手编写,将其转化成一些实用的技能。另一方面,通过学生小组完成任务,提高团队意识,增加凝聚力,让同学们意识到团结就是力量,每个人都是重要的一份子。 二、题目:汉诺塔游戏程序 <1> 问题描述:在平面上有三个位置A、B、C,在A位置上有n 个大小不等的圆盘、小盘压在大盘上形成圆盘堆。要求将A位置的N个圆盘通过B位置移动到C位置上,并按同样的顺序叠放。 移动圆盘时必须遵循以下规则: 1.每一次只能移动一个圆盘 2.圆盘可以放在A、B、C任何一个塔座上 3.任何时刻都不能将大圆盘压在小圆盘上 <2> 基本要求: 圆盘的个数从键盘输入(如3-64等);用动画的形式在屏幕上显示盘的移动。 三、问题分析和任务定义 1、已知有三个塔(1、 2、3)和n个从大到小的金碟子,初始状态时n个碟子按从大到小的次序从塔1的底部堆放至顶部。 2、要求把碟子都移动到塔2(按从大到小的次序从塔2的底部堆

放至顶部)。 3、每次移动一个碟子。 4、任何时候、任何一个塔上都不能把大碟子放到小碟子的上面。 5、可以借助塔3。 先考虑a杆下面的盘子而非杆上最上面的盘子,于是任务变成了: 1、将上面的N个盘子移到b杆上; 2、将a杆上剩下的盘子移到c杆上; 3、将b杆上的全部盘子移到c杆上。 将这个过程继续下去,就是要先完成移动n个盘子、n-1个盘子、n-2个盘子....1个盘的工作。 四、课题介绍: 4.1 汉诺塔问题初始模型: 4.2 实现步骤: 为满足题目中盘子的移动问题,必须遵循的条件是:一次

汉诺塔 面向对象课程设计

数据库课程设计报告------------题目:汉诺塔 学院名称:计算机学院 专业名称:计算机科学与技术 班级:计算机08-08班 学号:0804010807 姓名:田昊 指导教师:孙冬璞 起始时间:2011年1月5日-------2011年1月9日

摘要 汉诺塔(又称河内塔)问题是一个古典的数学问题,是一个用递归方法解题的典型例子。问题是这样的:开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。 利用计算机图形学进行汉诺塔演示程序设计,是利用C语言绘图函数实现汉诺塔的递归算法图形界面演示过程。通过C语言实现图形学的绘图,程序控制,以及区域填充,并根据汉诺塔的算法原理实现大小不同的盘子移动的全过程演示。 1 需求分析 1.1 需求概述 汉诺塔演示程序设计是计算机图形学中图形变换的内容之一。而图形学中的图形变换的概念是由简单图形生成复杂图形,可用二维图形表示三维形体,甚至可以对静态图形经过快速变换而获得图形的动态显示效果。其任务是研究各点坐标之间的变化规律。而本次课程设计就是利用C语言以及图形函数实现汉诺塔的递归算法来进行其盘块移动的全过程显示。在TC环境中要实现这样的功能,就要牵涉到图形设备接口的知识。Windows图形设备接口是为与设备无关的图形设计的,是Windows系统的重要组成部分,负责系统与用户或绘图程序之间的信息交换,并控制在输出设备上显示图形或文字。应用程序必须通知图形设备接口来加载特定的设备驱动,一旦驱动得以加载,就可以准备应用设备进行相关的操作这些任务都要通过创建和维护设备描述表来完成。在实现汉诺塔演示程序设计时,是利用坐标系统而得到的,而在Windows应用程序中有两种坐标系统:设备坐标系统和逻辑坐标系统。其中设备坐标系统中又有三种相互独立的坐标系统:屏幕坐标系统、窗口坐标系统和用户区坐标系统。这些坐标系统均以像素点来表示度量的单位。屏幕坐标系统使用整个屏幕作为坐标区域,原点为屏幕原点。窗口坐标系统使用了边界在内的应用程序的窗口作为坐标区域。窗口边界的左上角是坐标系统的原点。用户坐标系统是最经常使用的坐标系统。用户区是窗口工作区,不包括窗口边界、菜单条及滚动条等。用户一般只需操作应用程序的用户区,因此用户区坐标系统对大多数应用程序都是适用的。

相关主题
文本预览
相关文档 最新文档