您的位置:首页 > 其它

汉诺塔问题

2015-08-21 17:06 169 查看




moveDisks(int n, Tower origin, Tower destination, Tower buffer)

{

//终止条件

if (n <= 0) return;

/*将顶端n-1个盘子从origin移至buffer,

将destination用作缓冲区。*/

moveDisks(n - 1, origin, buffer, destination);

/*将origin顶端的盘子移至destination*/

moveTop(origin, destination);

/*将顶部n-1个盘子从buffer移至destination,

将origin用作缓冲区。*/

moveDisks(n - 1, buffer, destination, origin);

}


下面的代码给出了这个算法更详细的实现.

public static void main(String[] args) {

// TODO Auto-generated method stub

int n=3;

Tower[] towers=new Tower
;

for(int i=0;i<3;i++)

{

towers[i]=new Tower(i);

}

for(int i=n-1;i>=0;i--)

{

towers[0].add(i);

}

towers[0].moveDisks(n,towers[2],towers[1]);

}

public class Tower{

private Stack<Integer> disks;

private int index;

public Tower(int i)

{

disks=new Stack<Integer>();

index=i;

}

public int index()

{

return index;

}

public void add(int d)

{

if( !disks.isEmpty() && disks.peek() <= d )

{

System.out.println("Error placing disk"+d);

}

else

{

disks.push(d);

}

}

public void moveTopTo(Tower t)

{

int top=disks.pop();

t.add(top);

System.out.println("Move disk"+top+"from "+index()+"to"+t.index());

}

public void moveDisks(int n,Tower destination,Tower buffer)

{

if( n > 0 )

{

moveDisks(n-1,buffer,destination);

moveTopTo(destination);

buffer.moveDisks(n-1, destination, this);

}

}

}

严格来说,并不一定要将柱子实现为独立的对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: