9.3栈和队列(五)——汉诺塔问题

来源:互联网 发布:网上做账软件 编辑:程序博客网 时间:2024/06/05 14:48
/**
 * 功能:汉诺塔问题
 * 描述:有3根柱子及N个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,
 *           所有盘子自底向上从大到小依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。
 *          移动圆盘时有以下限制:
 *          1)每次只能移动一个盘子。
 *          2)盘子只能从柱子顶端滑出移到下一根柱子。
 *          3)盘子只能叠在比它大的盘子上。
 *          请运用栈,将所有盘子从第一根柱子移到最后一根柱子。
 */
import java.util.Stack;public class Demo {      public static void main(String[] args) {             // TODO Auto-generated method stub             int n=3;             int disks=5;            Tower[] towers= new Tower[ n];             for( int i=0; i< n; i++){                   towers[ i]= new Tower( i);            }                         for( int i= disks; i>=0; i--){                   towers[0].add( i);            }             towers[0].moveDisks( disks, towers[2], towers[1]);      }}class Tower{      public  Stack<Integer> disks;      public int index;            public Tower(int index){             disks= new Stack<Integer>();             this. index= index;      }            public int getIndex(){             return this. index;      }            public void add(int d){             if(! disks.isEmpty()&& disks.peek()<= d)                  System. out.println( "Error placing disk"+d);             else                   disks.push( d);      }            //将orgin顶端的盘子移到destination      public void movetoTop(Tower t){             int top= disks.pop();             t.add( top);            System. out.println( "Move disk "+ top+ " from "+this.getIndex()+" to "+t.getIndex());      }            public void moveDisks( int n,Tower destination,Tower buffer){             if( n>0){                   //将顶端n-1个盘子从origin移到buffer                  moveDisks( n-1, buffer, destination);                   this.movetoTop( destination);                   //将顶部n-1个盘子从buffer移到destination,将origin用作缓冲区                   buffer.moveDisks( n-1, destination, this);            }      }}

0 0