汉诺塔玩法解密(非代码)

附图地址:
http://www.docin.com/p1-532193843.html


在线玩网站:
http://www.mathsisfun.com/games/towerofhanoi.html


定义:借助针——非目的地
目的针——目的地



只要遵循两个规则。从下往上数,偶数个盘片要去到借助针,奇数个盘片要去到目的针。

如图。
最初的思路:我们要让4去到借助针。3去到目的针。2去到借助针。1 去到目的针。
但移动了两步之后我们发现


这时候需要把借助针清空。才能让2去到借助针(Tower 2)。清空的方法是把Tower 2的盘片移动到Tower 3 。
之后发现


这时候我们需要把tower3清空。让它上面的盘片都去到Tower2。才能让Tower1上最后一个盘片去到Tower3(我们最初的思路)

于是问题就转化为以Tower1为借助针。Tower3为目的针的汉诺塔问题了。



同样的。我们要让3 去到目的针,2去到借助针。1去到目的针。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
汉诺塔是一个经典的数学问题,它由三根柱子和一些不同大小的圆盘组成。开始时,所有的圆盘都按照从大到小的顺序堆叠在一根柱子上,目标是将所有的圆盘从起始柱子移动到目标柱子上,同时遵守以下规则: 1. 每次只能移动一个圆盘; 2. 大圆盘不能放在小圆盘上面。 汉诺塔问题可以通过分治法来解决。分治法是一种将问题分解成更小的子问题,并通过解决子问题来解决原始问题的方法。 以下是汉诺塔问题的递归解法的代码示例(使用C++语言): ```cpp #include <iostream> using namespace std; void hanoi(int n, char from, char to, char aux) { if (n == 1) { cout << "Move disk 1 from " << from << " to " << to << endl; return; } hanoi(n - 1, from, aux, to); cout << "Move disk " << n << " from " << from << " to " << to << endl; hanoi(n - 1, aux, to, from); } int main() { int num_disks; cout << "Enter the number of disks: "; cin >> num_disks; hanoi(num_disks, 'A', 'C', 'B'); return 0; } ``` 这段代码中,`hanoi`函数用于解决汉诺塔问题。它接受四个参数:圆盘的数量 `n`,起始柱子 `from`,目标柱子 `to`,辅助柱子 `aux`。当 `n` 等于 1 时,直接将圆盘从起始柱子移动到目标柱子。否则,先将 `n-1` 个圆盘从起始柱子移动到辅助柱子,然后将最大的圆盘从起始柱子移动到目标柱子,最后将剩余的 `n-1` 个圆盘从辅助柱子移动到目标柱子。 请注意,这只是汉诺塔问题的一种解法,还有其他解法可以使用迭代等方法实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值