[题目] 4座塔的Hanoi

Posted baseai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[题目] 4座塔的Hanoi相关的知识,希望对你有一定的参考价值。

题目地址

经典递推题。

解出 n (1<=n<=12) 个盘子 \(4\) 座塔的Hanoi(汉诺塔)问题最少需多少步?(1到12每个答案分别占一行)

题解

在原Hanoi问题中 \(d[i]\) 表示 3座塔下 \(i\) 个盘子的最小步数。如果你还没有忘记的话:

\[d[i]=d[i-1]*2+1\]

这个式子还是很显然的。

我们设 \(f[i]\) 表示 4座塔下 \(i\) 个盘子的最小步数。 那么有:

\[f[i]=\textmin\f[j]*2+d[i-j]\(1<=j<=i)\]

那我们来仔细康康这个式子,\(f[j]\) 指将 \(j\) 个盘子放在 \(B\) 塔上,剩下的盘子采用 3座塔全部放在 \(D\) 塔上,再把 \(B\) 塔上的 \(j\) 个盘子放在 \(D\) 塔上。

Code

#include<bits/stdc++.h>
#define N 15
using namespace std;
int n;
int f[N],d[N];
int main()

    memset(f,0x3f,sizeof(f));
    d[1] = f[1] = 1; puts("1");
    for(int i=2;i<=12;++i) 
        d[i] = d[i-1]*2 + 1;
        for(int j=1;j<=i;++j) 
            f[i] = min(f[i],f[j]*2+d[i-j]);
        
        printf("%d\n",f[i]);
    
    return 0;

理解了之后,我们可以来思考一下 \(n\) 个盘子 \(m\) 座塔的做法。

我们设 \(f[i][j]\)\(i\) 座塔 ,\(j\) 个盘子的最少步数,那么有:

\[f[i][j]=\textmin\f[i][k]*2+f[i-1][j-k]\\]

其实原理是一样的。

睡个好觉吧,晚安!

以上是关于[题目] 4座塔的Hanoi的主要内容,如果未能解决你的问题,请参考以下文章

题解 DTOJ #4423. 「THUSC2019」塔

CF392B Tower of Hanoi

汉诺塔的实现

Hanoi Tower 汉诺塔的简单分析/C

Codeforces 229D Towers

汉诺塔的非递归算法