刷题记录(汉诺塔变形)

题目
汉诺塔问题的变形,汉诺塔问题里就感到了递归的奇妙,这道题也是如此(不会做,看的蓝书题解。。。)
记盘子初始start[i],目标位置final[i],首先找到最大的第一个要移动的盘子,其他比他大且不用移动的盘子不用管,如果要把该盘子移动到对应fina[i],则应先把前i-1个盘子移动到中转柱(6-start[i]-final[i]),再将其移到目标柱上,这还没完,还需要对中转柱上的盘子操作,对盘子的操作是可逆的,记当前状态为中转状态,则余下操作可以看成i-1个盘子由final最终状态移为中转状态,这样的话如果得到函数f(i,sta,fin)计算把前i个盘子从各自sta位置移动到fin位置步数(sta不是单指start位置),则最终答案为f(i-1,start,中转柱)+f(i-1,final,中转柱)+1。接下来就要解决这个函数是如何计算的。记i的sta为p[i],p可能是start或final。
如果p[i]==fin,f(i,p[i],fin)=f(i-1,p[i-1],fin);
若不等,则答案为f(i-1,p[i-1],6-fin-p[i])+1+把中转站上i-1个盘子移到fin上,最后一项为汉诺塔ans=2(i-1)-1.则最终答案f(i-1,p[i-1],6-fin-p[i])+2i-1

ll solve(int* p,int wh,int fina)
{
    if(wh==0) return 0;
    if(p[wh]==fina) return solve(p,wh-1,fina);
    return solve(p,wh-1,6-fina-p[wh])+(1ll<<(wh-1));
}

大体思路就是这样,其中利用了对称性作了一个转换很巧妙.
再就是对递归的理解也加深了(虽然该不会还是不会)。

发布了23 篇原创文章 · 获赞 0 · 访问量 333

猜你喜欢

转载自blog.csdn.net/qq_45753808/article/details/104707202