[学习笔记]进阶指南day2-再探汉诺塔问题

大概是一些口胡,参考了不少Wikipedia上的资料,这里也只是记录了自己看的一部分东西,实际上关于汉诺塔的变形似乎远不止这么多。


先回顾原始版本的Hanoi问题的做法,ABC三个柱子,我们记为\((n,A,B,C)\),要把圆盘全部从A柱移到C柱,最后的盘子一定要移,所以不难给出方案:先把\(n-1\)个盘子移到B,转化成了子问题\((n-1,A,C,B)\),再通过一步将\(n\)这个盘子移到\(C\),最后再来一次\((n-1,B,C,A)\)。如果要问方案数,那就有\(T(n)=2T(n-1)+1\),以及\(T(1)=1\),容易求得\(T(n)=2^n -1\)

不过这里值得一提另一种考虑的方式:考虑用一个\(n\)元组表示每个盘子的位置,例如\((a,a,c)\)就表示最小和次小的盘子在A柱,最大的盘子在C柱。初始状态是\((a,a,\dots,a)\),最终状态是\((c,c,\dots,c)\),每个状态作为一个结点,可以一步到达的两个状态连一条边,

就会得到形如这样子的图(图源Wikipedia),容易发现其中的分形结构(没错这是一个谢尔宾斯基三角形),然后似乎就可以用这张图来搞一些事情…

比如一些简单的变形:每次只能在\((A,B)\)或者\((B,C)\)之间移动,全部移到\(C\)。这样相当于删去了一些边:图中一共有\(3^n\)个结点(容易证明,原来规则下每个盘子可以到达任意的位置),3个点度数为2,\(3^n -3\)个点度数为3,总边数是\(\frac{3}{2}(3^n -1)\)条,加了这条限制之后相当于少了\(1/3\)的边(少掉了所有ac之间的边),最后得到一个\(|V|=3^n, |E|=3^n-1\)的图,同时也能保证这张图联通(考虑原本的一个\(k\)阶谢尔宾斯基三角形由3个\(k-1\)阶的小三角形和三条边组成,三条边删去一条边依然联通),于是最后得到的一定是一个\(3^n\)个点的链,咕最小步数是\(3^n\)

以及书上提到的一个变形:改成任意\(r\)个塔,\(n\)个盘的情形。塔的增加给我们的操作留了更多的余地,记对应的最小步数为\(T(n,r)\),这里的递归就不再只是考虑最后一个盘子放到第\(r\)个塔上了:因为对于\(r=3\)的时候我们只能这么做,而在这里可以考虑先把\(1,2,\dots,k\)这些盘移动到一个辅助的塔\(X\)上,再处理剩下的\(k+1,\dots,n\)这些盘,这里一定不能移到\(X\),也就是只有\(r-1\)个塔可以用,于是对应的方案是\(2T(k,r)+T(n-k,r-1)\),对应的答案\(\begin{aligned}T(n,r)=\min_{k=1,\dots,n-1}\{2T(k,r)+T(n-k,r-1)\}\end{aligned}\)

posted @ 2021-02-10 21:27  yoshinow2001  阅读(106)  评论(0编辑  收藏  举报