import java.util.Stack;
public class HanNuoTa {
public static void main(String[] args){
HanNuoTa hnt = new HanNuoTa(6);
}
public HanNuoTa(int count){
this.count = count;
// try{
// fout = new FileOutputStream("store.txt");
// writer = new OutputStreamWriter(fout,"UTF-8");
hanNuoTa(count,'A','B','C',0);
//hanNuoTa_stack(count,'A','B','C',0);
// writer.close();
// fout.close();
// }catch(Exception e){
// e.printStackTrace();
// }
}
/**
*
* @param n 汉诺塔的规模n
* @param start 汉诺塔的起点
* @param transit 汉诺塔的中转节点
* @param destination 汉诺塔的终点
* @param level 迭代的深度,初始深度为0
*/
private void hanNuoTa(int n,char start,char transit,char destination,int level){
if(n == 1){
move(n,start,destination);
return;
}
level++;
hanNuoTa(n-1,start,destination,transit,level);
move(n,start,destination);
hanNuoTa(n-1,transit,start,destination,level);
}
private class Element{
public int n,level;
public char start,transit,destination;
public Element(int n,char start,char transit,char destination,int level){
this.n = n;
this.start = start;
this.transit = transit;
this.destination = destination;
this.level = level;
}
}
private void hanNuoTa_stack(int n,char start,char transit,char destination,int level){
Stack<Element> stack = new Stack();
stack.push(new Element(n,start,transit,destination,level));
while(!stack.empty()){
Element e = stack.pop();
if(e.n == 1){
move(e.start,e.destination);
}else{
stack.push(new Element(n-1,e.transit,e.start,e.destination,level));
move(e.start,e.destination);
stack.push(new Element(n-1,e.start,e.destination,e.transit,level));
}
e = null;
}
}
/**
* 显示效果:
* move 1 from A to B
* move 2 from A to C
* @param mark 节点的标识或名称
* @param start 移动的起点标识或名称
* @param destination 移动的终点标识或名称
*/
private void move(int mark,char start,char destination){
StringBuffer sb = new StringBuffer();
sb.append("move ");
sb.append(mark);
sb.append(" from ");
sb.append(start);
sb.append(" to ");
sb.append(destination);
sb.append("\r\n");
System.out.print(sb.toString());
// try{
// writer.write(sb.toString());
// }catch(Exception e){
// e.printStackTrace();
// }
sb.delete(0,sb.length());
}
private void move(char start,char destination){
StringBuffer sb = new StringBuffer();
sb.append("move ");
sb.append("the top disk from ");
sb.append(start);
sb.append(" to ");
sb.append(destination);
sb.append("\r\n");
System.out.print(sb.toString());
sb.delete(0,sb.length());
}
// private Writer writer;
// private FileOutputStream fout ;
private int count;//初始规模
}
用Java实现汉诺塔
最新推荐文章于 2023-11-05 16:16:46 发布