奇怪的汉诺塔

简介: 笔记

96. 奇怪的汉诺塔 - AcWing题库


题意

汉诺塔问题,条件如下:


1、这里有 A、B、C 和 D 四座塔。


2、这里有 n 个圆盘,n 的数量是恒定的。


3、每个圆盘的尺寸都不相同。


4、所有的圆盘在开始时都堆叠在塔 A 上,且圆盘尺寸从塔顶到塔底逐渐增大。


5、我们需要将所有的圆盘都从塔 A 转移到塔 D 上。


6、每次可以移动一个圆盘,当塔为空塔或者塔顶圆盘尺寸大于被移动圆盘时,可将圆盘移至这座塔上。


请你求出将所有圆盘从塔 A 移动到塔 D,所需的最小移动次数是多少。


100.png

                                             汉诺塔参考模型


思路

首先我们要明确这题在问什么,用一句话概括上面的题意:将n层汉诺塔,通过两根柱子的辅助,移动到第四根柱子上


设 g[n] 为 n 层汉诺塔按照题意需要移动的最小步数,g[n] 可以怎么求呢?


先取最上面的 i 层,通过 C、D 两个柱子 移动到 B 柱上,再把剩下的 n - i 层 通过 C 柱 移动到 D 柱,最后把 B 柱上的 i 层 通过 A、C两个柱子移动到 D 柱,每个过程的最小值加在一起就是最小步数。


上述过程中,有两个过程为 借助两个柱子,从一个柱子移动到另一个柱子 这即为我们要求的 g 数组,还有一个过程为 借助一个柱子,从一个柱子移动到另一个柱子 这就是我们熟悉的 三柱汉诺塔问题。


对于每一个 n 枚举 i 找到最小值 即为答案


代码

#include<bits/stdc++.h>
// #define int long long
#define INF 0x3f3f3f3f
#define mod 1000000007
#define MOD 998244353
#define rep(i, st, ed) for (int (i) = (st); (i) <= (ed);++(i))
#define pre(i, ed, st) for (int (i) = (ed); (i) >= (st);--(i))
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
template<typename T> inline T gcd(T a, T b) { return b ? gcd(b, a % b) : a; }
template<typename T> inline T lowbit(T x) { return x & -x; }
const int N = 1e3 + 10;
int f[20], g[20];
int n = 12;
void solve() {
  f[1] = 1;
  for (int i = 2; i <= n; ++i) {
    f[i] = 2 * f[i - 1] + 1;
  }
  memset(g, 0x3f, sizeof g);
  g[1] = 1;
  for (int i = 1; i <= n; ++i) {
    for (int j = 0; j <= i; ++j) {
      g[i] = min(g[i], 2 * g[j] + f[i - j]);
    }
  }
  for (int i = 1; i <= 12; ++i)printf("%d\n", g[i]);
}
signed main() {
  // int t; cin >> t;
  // while (t--)
    solve();
  return 0;
}
in() {
// int t; cin >> t;
// while (t–)
solve();
return 0;
}
目录
相关文章
|
JavaScript 前端开发 区块链
|
Prometheus Kubernetes 监控
Prometheus 与 Kubernetes 的集成
【8月更文第29天】随着容器化应用的普及,Kubernetes 成为了管理这些应用的首选平台。为了有效地监控 Kubernetes 集群及其上的应用,Prometheus 提供了一个强大的监控解决方案。本文将详细介绍如何在 Kubernetes 集群中部署和配置 Prometheus,以便对容器化应用进行有效的监控。
892 3
|
存储 缓存 Shell
Transformers 4.37 中文文档(一)(3)
Transformers 4.37 中文文档(一)
1353 1
Transformers 4.37 中文文档(一)(3)
|
SQL 缓存 Java
Data Access 之 MyBatis Plus(四)- MyBatis Plus Plugin
Data Access 之 MyBatis Plus(四)- MyBatis Plus Plugin
Data Access 之 MyBatis Plus(四)- MyBatis Plus Plugin
|
算法 数据可视化 数据挖掘
【数据挖掘】密度聚类DBSCAN讲解及实战应用(图文解释 附源码)
【数据挖掘】密度聚类DBSCAN讲解及实战应用(图文解释 附源码)
1339 1
|
Kubernetes Java Docker
使用Kubernetes部署Spring Boot应用的实践
使用Kubernetes部署Spring Boot应用的实践
|
敏捷开发 数据可视化 测试技术
【Docker项目实战】使用Docker部署nullboard任务管理工具
【5月更文挑战第14天】使用Docker部署nullboard任务管理工具
589 4
|
缓存 Java 索引
ByteBuffer 字节缓冲区
ByteBuffer 字节缓冲区
198 0
|
安全 Java Spring
Spring Security系列教程19--会话管理之处理会话过期
前言 在上一章节中,一一哥 给各位讲解了HTTP协议、会话、URL重新、会话固定攻击等概念,并且实现了对会话固定攻击的防御拦截。 在Spring Security中,其实除了可以对会话固定攻击进行拦截之外,还可以对会话过期进行处理,也就是会话可能会过期,过期了该怎么处理。接下来请各位跟着 壹哥 继续学习,看看会话过期时到底怎么处理的吧。 一. 会话过期 1. 会话过期概念 在处理会话过期之前,我们首先得知道啥是会话过期。 所谓的会话过期,是指当用户登录网站后,较长一段时间没有与服务器进行交互,将会导致服务器上的用户会话数据(即session)被销毁。此时,当用户再次操作网页时,如果服务器进
940 0
|
消息中间件 缓存 Java
高性能架构设计
高性能架构设计
329 5