洛谷 B4579:[GESP202609 四级] 新汉诺塔

【题目来源】
https://www.luogu.com.cn/problem/B4579

【题目描述】
汉诺塔问题是最经典的递推问题之一:
有三个可以放圆盘柱子,编号为 A、B 和 C。
开始时柱子 A 上套着 n 个圆盘,它们从上到下按照从小到大的顺序排列。
我们的任务是要把这 n 个圆盘移到柱子 C 上,并保持它们的原有顺序不变。
在移动圆盘的过程中,需要遵守以下规则:
(1)圆盘只能从一根柱子顶部拿出,从另一根柱子顶部放入。
(2)每次只能移动一个圆盘。
(3)小圆盘必须时刻位于大圆盘之上。
小杨在学习了汉诺塔问题后,决定添加一个新规则:
(4)每一次移动,圆盘只能从 A 移动到 B,从 B 移动到 C,或者从 C 移动到 A;其它移动是不允许的。
在新规则下,给定圆盘数量 n,试问最少移动步数是多少?

【输入格式】
输入一个正整数 n,表示圆盘的数量。

【输出格式】
输出一个整数,表示在新规则下将 n 个圆盘从 A 移动到 C 所需的最少移动步数。

【输入样例】
2

【输出样例】
7

【样例解释】
以下步骤是最佳的(编号为 1 的是小盘,为 2 的是大盘):
(1)将 1 从 A 移动到 B;
(2)将 1 从 B 移动到 C;
(3)将 2 从 A 移动到 B;
(4)将 1 从 C 移动到 A;
(5)将 2 从 B 移动到 C;
(6)将 1 从 A 移动到 B;
(7)将 1 从 B 移动到 C。
可以证明没有更少步骤可以完成这个任务。

【数据范围】
对于所有数据,n≤20。

【算法分析】
● 本题是单向汉诺塔问题(循环移动:A→B,B→C,C→A)。
● 设 fk 表示 k 个盘子做一次相邻正向转移(A → B,B → C,C → A)的最小步数。设 sk 表示 k 个盘子跨一环转移(A → C,B → A,C → B)的最小步数。
任务一:把 k 个盘子从 A 搬到 B
阶段 1:k-1 个盘由 A → C,跨一环转移,代价 sk-1。
阶段 2:A 柱上的第 k 个盘由 A → B,代价+1。
阶段 3:k-1 个盘由 C → B,跨一环转移,代价 sk-1。
总步数为:fk=sk-1+1+sk-1=2*sk-1+1

任务二:把 k 个盘子从 A 搬到 C
阶段 1:k-1 个盘由 A → C,跨一环转移,代价 sk-1。
阶段 2:A 柱上的第 k 个盘由 A → B,代价+1。
阶段 3:k-1 个盘由 C → A,相邻正向转移,代价 fk-1。
阶段 4:B 柱上的第 k 个盘由 B → C,代价+1。
阶段 5:k-1 个盘由 A → C,跨一环转移,代价 sk-1。
总步数为:sk=2*sk-1+fk-1+2

【算法代码】

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

typedef long long LL;
const int N=25;
LL s[N],f[N];

int main() {
    int n;
    cin>>n;
    f[1]=1,s[1]=2;
    for(int i=2; i<=n; i++) {
        f[i]=2*s[i-1]+1;
        s[i]=2*s[i-1]+f[i-1]+2;
    }
    cout<<s[n]<<endl;
    return 0;
}

/*
in:2
out:7
*/

【参考文献】
https://gesp.ccf.org.cn/101/attach/1767258770636832.pdf
https://blog.csdn.net/hnjzsyjyj/article/details/156025724

相关推荐
王老师青少年编程7 个月前
csp信奥赛c++中的递归和递推研究
c++·算法·递归·递推·csp·信奥赛
芜湖xin9 个月前
【题解-Acwing】96. 奇怪的汉诺塔
算法·递推·《算法进阶指南》
shandianchengzi9 个月前
【小白向】错位排列|图文解释公考常见题目错位排列的递推式Dn=(n-1)(Dn-2+Dn-1)推导方式
笔记·算法·公考·递推·排列·考公
Onesoft%J1ao1 年前
C++竞赛递推算法-斐波那契数列常见题型与例题详解
c++·算法·动态规划·递推·信息学奥赛
MoRanzhi12031 年前
245. 2019年蓝桥杯国赛 - 数正方形(困难)- 递推
python·算法·蓝桥杯·国赛·递推·2019
咚咚轩2 年前
3 算法1-4 过河卒
递推
丶Darling.2 年前
代码随想录 | Day38 | 动态规划 :01背包应用 目标和&&一和零
c++·算法·动态规划·记忆化搜索·回溯·递推·01背包
小程xy3 年前
AcWing 95. 费解的开关
位运算·递推·acwing
医学小达人3 年前
Python leetcode 2906 构造乘积矩阵,力扣练习,矩阵递推,经典递推题目,递推代码实战
数据结构·python·leetcode·递推·构造乘积矩阵