摘要: 汉诺塔问题变形题问题描述:在经典汉诺塔的基础上加一个条件,即,如果再加一根柱子(即现在有四根柱子a,b,c,d),计算将n个盘从第一根柱子(a)全部移到最后一根柱子(d)上所需的最少步数,当然,也不能够出现大的盘子放在小的盘子上面。注:1#include#define M 99999999int main(){ int i,n,x,min,f[65]; f[1]=1; f[2]=3; for(i=3;i<=65;i++) { min=M; for(x=1;x<i;x++) if(2*f[x]+pow(2,i-x)-... 阅读全文
posted @ 2014-03-01 15:18 xtaq 阅读(125) 评论(0) 推荐(0) 编辑
摘要: 经典汉诺塔系列的题。先回忆一下普通汉诺塔的解决方法:(1)将A上n-1个盘子借助C座线移到B座上;(2)把A座上剩下的一个盘移到C座上;(3)将n-1个盘从B座借助于A座移到C座上。本题求:n阶汉诺塔,上数第k个盘子的移动次数分析:第K个盘子的移动与第k个盘子上的盘子移动无关,所以问题转换为n-k+1阶汉诺塔中第一个盘子的移动次数。然后看上述三个步骤中,(2)中第K个盘子未移动,所以递推公式为:f(n) = 2 * f(n-1)由于问题已经转化成n-k+1阶汉诺塔,故所求通项f[n]=2^(n-k)。#include #include int main() { int c,n,k; ... 阅读全文
posted @ 2014-03-01 14:46 xtaq 阅读(112) 评论(0) 推荐(0) 编辑