http://tieba.baidu.com/f?kz=694089361
设盘子编号为1~N,编号大的尺寸大,有三根柱子1~3。
1、输出初始局面(所有盘子都在1号柱子)到终止局面(所有盘子都在3号柱子)的最优方案。
时间复杂度:Ο(2^N)
2、输出最优方案中某一局面之前经过的步骤数。
时间复杂度:Ο(N)
3、输出当前局面(不一定是最优解的中间步骤)到终止局面的最优方案。
时间复杂度:Ο(2^N)
4、输出当前局面下,把所有盘子移动到任一根柱子的最优方案。
时间复杂度:Ο(2^N)
5、输出当前局面下,把所有盘子移动到任一根柱子的最优方案所需步数。
时间复杂度:Ο(N)
易知,必定把 1~N-1 移动到 N 处
否则的话,需要至少 2^(N-1) 步,不会最优。
所以 N 所在位置就是 目标柱子
注意到如果 N、N-1、……、k+1 初始时都在同一个根柱子上,那就不用再管它们了。
只需考虑 k、k-1、……、1
之所以要移动 i,要么是为了给比它编号大的盘子让路,要么是因为要把它移动到目标柱子。
所以,如果要把 i 移动到某根柱子 X,那么 i-1、i-2、……、1 也应该移动到 柱子 X
总结:总结一下,对于求方案的问题,因为最坏情况下步骤数可以达到Ο(2^N),所以以上源码在渐进意义上达到最优复杂度。
对于求步骤数(无须输出方案),以上源码时间复杂度都是Ο(N),由于输入时间已达到Ο(N),所以在渐进意义上也达到了最优复杂度。