我只是四川理工学院的在校学生,听算法老师说汉洛塔至今还没有迭代算法,才产生兴趣写个这程序的。其中有什么不足的地方还希大家指教。
如果觉得写得还可以,帮我顶一下
package cn.suse;
import java.util.LinkedList;
public class Pillar {
/**
* 汉洛塔的柱子
*/
private String name;
private LinkedList<Integer> pillar=new LinkedList<Integer>();
public boolean isMoveOutAble=false;
public Pillar(String name) {
super();
this.name = name;
}
public String getName(){
return name;
}
//搬出柱子的顶部盘子
public Integer moveOut(){
return pillar.pop();
}
//把搬入柱子
public void moveIn(Integer i){
pillar.push(i);
}
public void clear() {
pillar.clear();
}
//判断柱子的盘子是否是偶数,因为可以根据盘子的奇偶数确定移出的盘子放进哪根柱子
public boolean isEvenCount(){
int i=pillar.size();
if(0==i%2){
return true;
}else{
return false;
}
}
//返回柱子顶部的盘号,根据盘子大小判断谁能移出
public int getTop(){
if(0==pillar.size()){
return Integer.MAX_VALUE;//如果为空就返回,一个无穷大的整数来,这样就不能搬出
}
return pillar.peekFirst();
}
//显示柱子上的所有盘号
public void show(){
System.out.print(name+":");
for(Integer i:pillar){
System.out.print(i+" ");
}
System.out.println("");
}
}
----------------------------------------------------------------------------------------------------------
package cn.suse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Date;
public class Hanoi {
/**
* 这是汉洛塔类,完成盘的搬运、显示工作
*/
private Pillar pillarA = new Pillar("A");
private Pillar pillarB = new Pillar("B");
private Pillar pillarC = new Pillar("C");
private int count;
//初始化汉洛塔
public boolean Init(int count) {
pillarA.clear();
pillarB.clear();
pillarC.clear();
pillarA.isMoveOutAble = true;
if (count > 0) {
for (int i = count; i > 0; i--) {
pillarA.moveIn(i);
}
return true;
}
return false;
}
//这是一个工具方法,用于接收输入的盘个数
public int getInputCount() {
BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
int i = 0;
do {
System.out.println("请输入1~64之间的圆盘数");
try {
String str = reader.readLine();
i=Integer.parseInt(str);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} while (i < 1 || i > 64);//这里用于限制用户输入盘数
return i;
}
//搬运盘子,注意里面函数的调用顺序是不能调换的,因getMoveInPillar函数中用的是搬出盘子后的数据
public void move() {
Pillar from = this.getMoveOutPillar();
Integer i = from.moveOut();
Pillar to = this.getMoveInPillar();
to.moveIn(i);
}
//反回当前应搬出的柱
public Pillar getMoveOutPillar() {
if (pillarA.isMoveOutAble) {
return pillarA;
} else if (pillarB.isMoveOutAble) {
return pillarB;
} else {
return pillarC;
}
}
//用于计算出应搬入的盘号,同时通过setMovePillar函数计算出下一次应搬出的柱子
//每次搬运前可以通过应搬出柱子上盘个数的奇偶确定应搬入的柱子,另外刚搬入的柱子下一次是不能搬出的。选出剩下的两个柱子中顶部的盘号小的作为下一次搬出的柱子,如果柱子没有盘子视为无穷大。
public Pillar getMoveInPillar() {
if (pillarA.isMoveOutAble) {
if (pillarA.isEvenCount()) {
pillarB.isMoveOutAble=false;
this.setMovePillar(pillarA, pillarC);
return pillarB;
} else {
pillarC.isMoveOutAble=false;
this.setMovePillar(pillarA, pillarB);
return pillarC;
}
} else if (pillarB.isMoveOutAble) {
if (pillarB.isEvenCount()) {
pillarC.isMoveOutAble=false;
this.setMovePillar(pillarA, pillarB);
return pillarC;
} else {
pillarA.isMoveOutAble=false;
this.setMovePillar(pillarC, pillarB);
return pillarA;
}
} else {
if (pillarC.isEvenCount()) {
pillarB.isMoveOutAble=false;
this.setMovePillar(pillarA, pillarC);
return pillarB;
} else {
pillarA.isMoveOutAble=false;
this.setMovePillar(pillarC, pillarB);
return pillarA;
}
}
}
//用于计算出下一次应搬出的柱子
public void setMovePillar(Pillar first,Pillar next){
int f=first.getTop();
int n=next.getTop();
if(f<n){//选出两者中顶部最小的作为下一次搬运的盘
first.isMoveOutAble=true;
next.isMoveOutAble=false;
}else{
first.isMoveOutAble=false;
next.isMoveOutAble=true;
}
}
//依次显示每个柱子上的盘号
public void show() {
pillarA.show();
pillarB.show();
pillarC.show();
System.out.println("");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Hanoi hanoi = new Hanoi();
int count = hanoi.getInputCount();
System.out.println("开始初始化..........");
hanoi.Init(count);
System.out.println("完成初始化...........");
System.out.println("A塔有" + count + "个圆盘搬到B塔 ,C为辅助塔");
double totalCount = Math.pow(2,count)-1;
hanoi.show();
System.out.println("开始搬运,一共要搬运" + totalCount + "次");
Date beginTime=new Date();
for (; totalCount > 0; totalCount--) {
hanoi.move();
hanoi.show();
}
System.out.println("搬运结束..............");
Date endTime=new Date();
System.out.println("共搬运了 "+(endTime.getTime()-beginTime.getTime())+"毫秒。");
}
}
如果觉得写得还可以,帮我顶一下
package cn.suse;
import java.util.LinkedList;
public class Pillar {
/**
* 汉洛塔的柱子
*/
private String name;
private LinkedList<Integer> pillar=new LinkedList<Integer>();
public boolean isMoveOutAble=false;
public Pillar(String name) {
super();
this.name = name;
}
public String getName(){
return name;
}
//搬出柱子的顶部盘子
public Integer moveOut(){
return pillar.pop();
}
//把搬入柱子
public void moveIn(Integer i){
pillar.push(i);
}
public void clear() {
pillar.clear();
}
//判断柱子的盘子是否是偶数,因为可以根据盘子的奇偶数确定移出的盘子放进哪根柱子
public boolean isEvenCount(){
int i=pillar.size();
if(0==i%2){
return true;
}else{
return false;
}
}
//返回柱子顶部的盘号,根据盘子大小判断谁能移出
public int getTop(){
if(0==pillar.size()){
return Integer.MAX_VALUE;//如果为空就返回,一个无穷大的整数来,这样就不能搬出
}
return pillar.peekFirst();
}
//显示柱子上的所有盘号
public void show(){
System.out.print(name+":");
for(Integer i:pillar){
System.out.print(i+" ");
}
System.out.println("");
}
}
----------------------------------------------------------------------------------------------------------
package cn.suse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Date;
public class Hanoi {
/**
* 这是汉洛塔类,完成盘的搬运、显示工作
*/
private Pillar pillarA = new Pillar("A");
private Pillar pillarB = new Pillar("B");
private Pillar pillarC = new Pillar("C");
private int count;
//初始化汉洛塔
public boolean Init(int count) {
pillarA.clear();
pillarB.clear();
pillarC.clear();
pillarA.isMoveOutAble = true;
if (count > 0) {
for (int i = count; i > 0; i--) {
pillarA.moveIn(i);
}
return true;
}
return false;
}
//这是一个工具方法,用于接收输入的盘个数
public int getInputCount() {
BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
int i = 0;
do {
System.out.println("请输入1~64之间的圆盘数");
try {
String str = reader.readLine();
i=Integer.parseInt(str);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} while (i < 1 || i > 64);//这里用于限制用户输入盘数
return i;
}
//搬运盘子,注意里面函数的调用顺序是不能调换的,因getMoveInPillar函数中用的是搬出盘子后的数据
public void move() {
Pillar from = this.getMoveOutPillar();
Integer i = from.moveOut();
Pillar to = this.getMoveInPillar();
to.moveIn(i);
}
//反回当前应搬出的柱
public Pillar getMoveOutPillar() {
if (pillarA.isMoveOutAble) {
return pillarA;
} else if (pillarB.isMoveOutAble) {
return pillarB;
} else {
return pillarC;
}
}
//用于计算出应搬入的盘号,同时通过setMovePillar函数计算出下一次应搬出的柱子
//每次搬运前可以通过应搬出柱子上盘个数的奇偶确定应搬入的柱子,另外刚搬入的柱子下一次是不能搬出的。选出剩下的两个柱子中顶部的盘号小的作为下一次搬出的柱子,如果柱子没有盘子视为无穷大。
public Pillar getMoveInPillar() {
if (pillarA.isMoveOutAble) {
if (pillarA.isEvenCount()) {
pillarB.isMoveOutAble=false;
this.setMovePillar(pillarA, pillarC);
return pillarB;
} else {
pillarC.isMoveOutAble=false;
this.setMovePillar(pillarA, pillarB);
return pillarC;
}
} else if (pillarB.isMoveOutAble) {
if (pillarB.isEvenCount()) {
pillarC.isMoveOutAble=false;
this.setMovePillar(pillarA, pillarB);
return pillarC;
} else {
pillarA.isMoveOutAble=false;
this.setMovePillar(pillarC, pillarB);
return pillarA;
}
} else {
if (pillarC.isEvenCount()) {
pillarB.isMoveOutAble=false;
this.setMovePillar(pillarA, pillarC);
return pillarB;
} else {
pillarA.isMoveOutAble=false;
this.setMovePillar(pillarC, pillarB);
return pillarA;
}
}
}
//用于计算出下一次应搬出的柱子
public void setMovePillar(Pillar first,Pillar next){
int f=first.getTop();
int n=next.getTop();
if(f<n){//选出两者中顶部最小的作为下一次搬运的盘
first.isMoveOutAble=true;
next.isMoveOutAble=false;
}else{
first.isMoveOutAble=false;
next.isMoveOutAble=true;
}
}
//依次显示每个柱子上的盘号
public void show() {
pillarA.show();
pillarB.show();
pillarC.show();
System.out.println("");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Hanoi hanoi = new Hanoi();
int count = hanoi.getInputCount();
System.out.println("开始初始化..........");
hanoi.Init(count);
System.out.println("完成初始化...........");
System.out.println("A塔有" + count + "个圆盘搬到B塔 ,C为辅助塔");
double totalCount = Math.pow(2,count)-1;
hanoi.show();
System.out.println("开始搬运,一共要搬运" + totalCount + "次");
Date beginTime=new Date();
for (; totalCount > 0; totalCount--) {
hanoi.move();
hanoi.show();
}
System.out.println("搬运结束..............");
Date endTime=new Date();
System.out.println("共搬运了 "+(endTime.getTime()-beginTime.getTime())+"毫秒。");
}
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货