首页 > 代码库 > Vijos1073 4-Hanoi-Tower
Vijos1073 4-Hanoi-Tower
此题虽是数学题,但是在题解中看到一种好的找递推式的思路,在此mark
按照惯例,从一个盘子做起.
n=1: 1次.
n=2: 3次.
n=3: 借助第4根柱子,5次搞定,比3根柱子省了2次.
以后都需要充分利用第4根柱子以减少次数.
n=4: 把1,2,3摊开,把1搭到2上面腾出一个空柱子移4,然后把3搭上去,再用3次把1,2搭上去,共计9次.
n=5: 把1,2,3摊开,再把1,2收到3的上面,腾出了两个空柱子,把4,5用3步移好,再次腾出了两个空柱子,把1,2摊开,然后1,2,3一并收到4上面,共计13次.
n=6: 把1,2,3摊开,再把1,2收到3的上面,腾出了两个空柱子,相当于用3根柱子移动4,5,6(7步完成),再次腾出了两个空柱子,把1,2摊开,然后1,2,3一并收到4上面,共计17次.
n=7:
屏蔽5,6,7,用n=4的方法把1,2,3,4移到另一根柱子上(9次)
此时腾出了两个空柱子,相当于用3根柱子移动5,6,7 (7次)
屏蔽5,6,7,用n=4的方法把1,2,3,4移好(9次)
共计25次.
n=8:
屏蔽6,7,8,用n=5的方法把1,2,3,4,5移到另一根柱子上(13次)
此时腾出了两个空柱子,相当于用3根柱子移动6,7,8 (7次)
屏蔽6,7,8,用n=5的方法把1,2,3,4,5移好(13次)
共计33次.
n=9:
屏蔽6,7,8,9,用n=5的方法把1,2,3,4,5移到另一根柱子上(13次)
此时腾出了两个空柱子,相当于用3根柱子移动6,7,8,9 (15次)
屏蔽6,7,8,9,用n=5的方法把1,2,3,4,5移好(13次)
共计41次.
n=10:
屏蔽7,8,9,10,用n=6的方法把1,2,3,4,5,6移到另一根柱子上(17次)
此时腾出了两个空柱子,相当于用3根柱子移动7,8,9,10 (15次)
屏蔽7,8,9,10,用n=6的方法把1,2,3,4,5,6移好(17次)
共计49次.
关于n个盘子如何确定分界线的问题:
首先1到(n-1)个盘子的问题需要全部解决,把所需步数记录下来,记为
f(1),f(2),……,f(n-1).
若把n个盘子分成前k个和后(n-k)个,则所需步数是
N = f(k) + 2^(n-k) - 1 + f(k)
其中,k=1,2,3,……,(n-1)
取最小的N值作为f(n)的值,对应的k值作为n个盘子的最佳分界线.
利用上述方法,我们不难得到前面一些n值的最佳步数和最佳分界线,我们把结果记录到一张表上.
由于n=0不失一般性,一并收入表中.
其中步数 f(n) = f(k) + 2^(n-k)-1 + f(k).
数学方法也就是在此基础上找规律
Vijos1073 4-Hanoi-Tower