博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
汉诺塔问题探讨
阅读量:5901 次
发布时间:2019-06-19

本文共 1482 字,大约阅读时间需要 4 分钟。

汉诺塔问题探讨

原题目

​ 有三根柱子,每根柱子上一开始都是空的。我们把这三个柱子编号为1, 2, 3,现在,第一根柱子上有\(N\)个盘子按照尺寸从小到大排列,我们的目的是把这些盘子按顺序从第一根柱子转移到第三根上。在移动过程中有要求,即每个柱子上要想往上叠加盘子,只能叠加比它尺寸小的盘子。那么我们该怎么挪?

Link

思路

​ 我们先想这样一个思路,就是我们先定义一个函数\(kansu(x, y, z)\),这个函数的功能是把\(x\)柱子上的\(y\)个盘子按照顺序移动到\(z\)柱子上。在想的过程中,一定不要考虑要怎么移动,只要知道我们要移动就好了。这样,调用一遍\(kansu(A, N - 1, B)\),现在\(B\)柱子上就有依次叠好的\(N - 1\)个盘子了,\(A\)上就只剩下最大的那一个,\(C\)上一个也没有。现在我们分析一下,\(A\)上只有一个最大的,也就是说可以在\(A\)上放置任意一个盘子。那么,把\(A\)上剩下的那个最大的移动到\(C\)上,那么\(C\)上的那个就是最大的了。现在,\(A\)是空的,\(B\)上有\(N - 1\)个,\(C\)上有一个最大的。

​ 这里大家注意一下,一开始\(A\)柱子上有\(N\)个盘子,\(B\)柱子和\(C\)柱子上都没有盘子,而现在\(A\)上没有,\(B\)\(N-1\)个,\(C\)上一个最大的。正因为\(C\)上有一个最大的,所以上面可以放任意一个盘子,也就等价于空的。这样,我们就把我们要解决的移动\(N\)个盘子的问题简化成了移动\(N-1\)个盘子的问题(只是位置不同),而这正是利用了递归的思想。

​ 现在我们完成了把一个最大的挪到\(C\)上的任务了,那么我们最终的任务就明了了,就是把每次的最大的挪到\(C\)柱子上,这样最大的越积越多,积到\(N\)个我们就得到结果了。

伪代码

S1:利用Kansu(A, N - 1, B)将A上的N - 1个盘子按照顺序移动到B柱子上S2:利用Move(A, C)将A柱子上剩下的一个最大的盘子移动到C柱子上S3:利用Kansu(B, N - 2, A)将B上的N - 2个盘子按照顺序移动到B柱子上......最后在一个一个Move的过程中,C上就按照从大到小的顺序垒好了N个盘子。

C++代码

#include 
#include
void Hanoi(const int n, const int A, const int B, const int C){ if (n > 0) { Hanoi(n - 1, A, C, B); std::cout << n << " from " << char (64 + t.x) << " to " << char (64 + t.y) << '\n'; Hanoi(n - 1, C, A, B); }}int main(int argc, char ** argv){ int n; std::cin >> n; std::cout << std::pow(2, n) - 1 << std::endl; // 2^n - 1 表示步数总数 Hanoi(n, 1, 3, 2); return 0;}

转载于:https://www.cnblogs.com/edwardtsui/p/6813626.html

你可能感兴趣的文章
webpack多页应用架构系列(七):开发环境、生产环境傻傻分不清楚?
查看>>
笨办法学C 练习1:启用编译器
查看>>
树的总结--树的性质(树的深度) leetcode
查看>>
nagios短信报警(飞信fetion20080522004-linrh4)
查看>>
【Android游戏开发之六】在SurfaceView中添加组件!!!!并且相互交互数据!!!!...
查看>>
linux 将大文件分成小文件
查看>>
CCNA- 距离矢量路由协议学习
查看>>
企业实践用户邮箱导入/导出(第2部分)
查看>>
如何学习Linux命令-初级篇
查看>>
从Oracle Public Yum为Oracle Linux建立本地的Yum源
查看>>
静态路由和默认路由
查看>>
关于阿里开发者招聘节 |这5道笔试真题 你会吗!???
查看>>
C#的异常处理机制
查看>>
vsftp:500 OOPS: could not bind listening IPv4 sock
查看>>
Linux安装BTCPayServer并设置比特币BTC和Lightning支付网关
查看>>
mysql安装,远程连接,以及修改密码
查看>>
Mybatis查询返回Map类型数据
查看>>
java的深拷贝与浅拷贝
查看>>
程序员如何提高工作效率
查看>>
promise
查看>>