hanoi递推

#include<iostream>
#define maxn 21
//最大的可以放在最上面,所以只要把前n-1个弄好,然后把最后一个丢上面就可以了
//所以f[n] = d[n-1]+2   d[n-1]是从最左边移动到最右边需要的步数
using namespace std;

int main()
{
    int n;
    long long dp[maxn],dd[maxn];

    dp[0] = 0;
    dp[1] = 2;
    dd[1] = 2;
    //先求出从最左边移动到最右边需要的步数。
    for(int i=2;i<=20;i++)
    {
        dp[i] = dp[i-1]*3 + 2;
    }
    //只有第n个盘子可以特殊处理
    //总的步数等于将n-1个移动到最右边,加上移动最大的盘子的两步。
    for(int i=2;i<=20;i++)
        dd[i] = dp[i-1]+2;
    cin>>n;
    while(n--)
    {
        int x;
        cin>>x;
        cout<<dd[x]<<endl;

    }
    return 0;
}


//参考博客https://blog.csdn.net/howardemily/article/details/52755264
/* https://blog.csdn.net/chang_mu/article/details/38129583  hanoi III
题目说我们可以将最大的一个放在上面!!
由汉诺塔III我们知道递推关系式为 F[n]=3*F[n-1]+2;
 那么对于这一题我们可以将n-1个盘子像汉诺塔的III的规则一样,
先移动到B,再将最大的盘子移动到B,再到C,再将B上的移动到C;
得出递推关系式为f[n]=F[n-1]+2;:
假设将n层塔从A经B挪到C需要f[n]步。那么具体的移动过程可以这样看:将上面n-1层从A经B挪到C需要f[n-1]步,再将第n层从A挪到B,需要一步,再将上n-1层从C经B挪到A,需要f[n-1]步,再将第n层从B挪到C,需要一步,再将上n-1层从A经B挪到C,需要f[n-1]步,总计3*f[n-1] + 2步,其中 f[1] = 2;

*/

猜你喜欢

转载自blog.csdn.net/qq_36734025/article/details/81171116