python面向过程实践汉诺塔_8.6汉诺塔

本文详细介绍了如何使用栈来解决经典的汉诺塔问题,通过递归算法将所有盘子从初始塔移动到目标塔。首先从最简单的n=1情况开始,然后逐步增加盘子数量,展示如何借助辅助塔作为缓冲移动盘子。文章提供了面向过程和面向对象两种编程实现方式,并给出了具体的代码示例。
摘要由CSDN通过智能技术生成

Problem

In the classic problem of the Towers of Hanoi, you have 3 towers and N disks of different sizes which can slide onto any tower. The puzzle starts with disks sorted inascendingorder

of size from top to bottom (i.e., each disk sits on top of an even larger one). You have the following constraints:

(1) Only one disk can be moved at a time.

(2) A disk is slid off the top of one tower onto another tower.

(3) A disk cannot be placed on top of a smaller disk.

Write a program to move the disks from the frst tower to the last using Stacks.

Solution

这个问题非常适合“Base Case and Build“方法。

我们从最小的可能情况开始:n=1。

Case n=1。如何把Disk1从Tower1移动到Tower3?

1.只需要简单地将Disk1从Tower1移到Tower3就可以了。

Case n=2。如何把Disk1和Disk2从Tower1移动到Tower3?

1.将Disk1从Tower1移动到Tower2

2.将Disk2从Tower1移动到Tower3

3.将Disk1从Tower2移动到Tower3

注意在上面的步骤中,Tower2实际上是作为一个缓冲的,也就是说当我们将其他Disk移到Tower3时来保存一个Disk。

Case n=3。如何把Disk1、Disk2和Disk3从Tower1移动到Tower3?

1.我们知道我们可以将上面的两个disk从一个tower移动到另一个tower(如上文所述),所以,假设我们已经做到了。但是,这里我们将上面两个disk移动到Tower2。

2.将Disk3移动到Tower3。

3.移动Disk1和Disk2到Tower。从上文我们已经知道我们可以做到这些。

Case n=4。如何把Disk1、Disk2、Disk3和Disk4从Tower1移动到Tower3?

1.移动Disk1,Disk2和Disk3到Tower2。

2.移动Disk4到Tower3。

3.移动Disk1,Disk2和Disk3到Tower3。

注意,tower的标签并不重要,它们实际是等价的。所以,利用Tower2作为缓冲将disks移到Tower3和利用Tower3作为缓冲将disks移动到Tower2是一样的。

面向过程的:

void Hanoi(int N,char src,char aux,char dest)

{

if(N == 1)

{

cout<

return;

}

Hanoi(N-1, src,dest,aux );

cout<

Hanoi(N-1, aux, src, dest);

}

int main(int argc, const char * argv[])

{

Hanoi(3, 'A', 'B','C');

return 0;

}

面向对象的:

class Tower

{

public:

Tower(int i)

:index_(i)

{

}

int index()

{

return index_;

}

void add(int d)

{

if(!disks.empty() && disks.top() <= d)

{

cout<

}

else

{

disks.push(d);

}

}

void moveTopTo(Tower& t)

{

int topDisk = disks.top();

disks.pop();

t.add(topDisk);

}

void moveDisks(int n,Tower& destnitation,Tower& buffer)

{

if (n > 0)

{

moveDisks(n-1,buffer,destnitation);

moveTopTo(destnitation);

buffer.moveDisks(n-1,destnitation,*this);

}

}

private:

stack disks;

int index_;

};

int main()

{

int n = 3;

Tower *towers[3];

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

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值