1822. Hanoi Tower IV

Fifnmar

虽然最后要求是相同盘子正序,但中间过程可以不必保持正序,即使倒了,也能负负得正。

设 $f(n)$ 表示底盘正序的移法,$g(n)$ 是底盘倒序的移法。除了底盘其它的都是正序。

$$
g(i) = 2 * g(n - 1) + 2
$$

f(i) 的思路:先把 $n-1$ 对盘子移到目标柱上,然后把两底盘移到中间柱上(现在是倒序的),再把 $n-1$ 对盘子移到起始柱上,再移底盘(现在正了),最后正序地把 $n-1$ 对盘子移到目标柱上。

$$
f(i) = g(n-1) + 2 + g(n-1) + 2 + f(n-1) = 2g(n-1)+4+f(n-1)
$$

#include "bits/stdc++.h"
using u64 = uint64_t;

int main() {
    uint64_t f[61], g[61];
    f[1] = 3; g[1] = 2;
    for (uint64_t i = 2; i != 61; ++i) {
        g[i] = 2 * g[i - 1] + 2;
        f[i] = 2 * g[i - 1] + 4 + f[i - 1];
    }
    for (uint64_t n; std::cin >> n;) {
        std::cout << f[n] << '\n';
    }
}
你当前正在回复 博客/题目
存在问题!