汉诺塔系列问题: 汉诺塔II、汉诺塔III、汉诺塔IV、汉诺塔V、汉诺塔VI

2023-10-26

汉诺塔

汉诺塔II hdu1207:

先说汉若塔I(经典汉若塔问题),有三塔。A塔从小到大从上至下放有N个盘子。如今要搬到目标C上。

规则小的必需放在大的上面,每次搬一个。求最小步数。

这个问题简单,DP:a[n]=a[n-1]+1+a[n-1],先把


上面的n-1个放在B上,把最大的放在目标C上,再把N-1个放回到C上就可以。

网上的一种最优解法例如以下:(1)将x(1<=x<=n)个盘从a柱依靠b,d柱移到c柱。这个过程须要的步数为F[x];(2)将a柱上剩下的n-x个盘依靠b柱移到d柱(注:此时不可以依靠c柱,由于c柱上的全部盘都比a柱上的盘小)     些时移动方式相当于是一个经典汉诺塔。即这个过程须要的步数为2^(n-x)-1(证明见再议汉诺塔一);(3)将c柱上的x个盘依靠a,b柱移到d柱上,这个过程须要的步数为F[x];第(3)步结束后任务完毕。

故完毕任务所须要的总的步数F[n]=F[x]+2^(n-x)-1+F[x]=2*F[x]+2^(n-x)-1;但这还没有达到要求,题目中要求的是求最少的步数,易知上式,随着x的不同取值,对于同一个n,也会得出不同的F[n]。即实际该问题的答案应该min{2*F[x]+2^(n-x)-1},当中1<=x<=n;在用高级语言实现该算法的过程中。我们可以用循环的方式。遍历x的各个取值,并用一个标记变量min记录x的各个取值中F[n]的最小值。

#include"stdio.h"
#include"string.h"
#include"math.h"
#define N 66
#define Inf 0x7fffffff
int main()
{
    __int64 i,j,min,f[N]={0,1,3};;
    for(i=3;i<N;i++)
    {
        min=Inf;
        for(j=1;j<i;j++)
        {
            if(min>2*f[j]+pow(2.0,1.0*i-j)-1)  //pow的返回值会超出64位。不能强制转换为整数
                min=2*f[j]+pow(2.0,1.0*i-j)-1; //注意两个參数应该都为double型。!

} f[i]=min; } while(scanf("%I64d",&i)!=-1) { printf("%I64d\n",f[i]); } return 0; }


汉若塔III  hdu2064:

先把上面的N-1个移动到C(必定有这个状态)。在把最大的移到B,再把N-1移到到A。把最大的移到C,再把N-1个移到C。

递推公式:f[n]=f[n-1]+1+f[n-1]+1+f[n-1]; 即f[n]=3*f[n-1]+2;

#include"stdio.h"
#include"string.h"
#include"math.h"
#define N 36
int main()
{
    __int64 n,i,f[N]={2};
    for(i=1;i<N;i++)
    {
        f[i]=3*f[i-1]+2;
    }
    while(scanf("%I64d",&n)!=-1)
    {
        printf("%I64d\n",f[n-1]);
    }
    return 0;
}


汉若塔IV HDU 2077

在汉若塔3的基础上。改条件:同意最大的盘子放到最上面(仅仅同意最大的放在最上面)当然最后须要的结果还是盘子从小到大排在最右边。

A,B,C三个塔。方程:ans[n]=ab[n-1]+1+1+bc[n-1]. (ab表示a到b)

DP思路:先把n-1个搬到b,再用俩步般最大的到C。再把n-1个从B到C。这里又要求出ac[n]和bc[n]:求其递推方程:bc[n]=bc[n-1]+1+ac[n-1],(1式)

会发现bc[n]方程和ab[n]一样的。

所以总方程ans[n]=2*bc[n-1]+2. (2式)

#include"stdio.h"
#include"string.h"
#include"math.h"
#define N 21
int main()
{
    int i,T;
    __int64 ac[N],bc[N],ans[N];
    ac[1]=2;
    bc[1]=1;
    for(i=2;i<N;i++)
    {
        ac[i]=3*ac[i-1]+2;
        bc[i]=bc[i-1]+ac[i-1]+1;
        ans[i]=2*bc[i-1]+2;
    }
    ans[1]=2;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&i);
        printf("%I64d\n",ans[i]);
    }
    return 0;
}

汉若塔V HDU1995
在经典汉若塔问题上附加问题:求出N个盘子时,第K号盘子的移动次数。
思路。一想就是二维DP,DP[n][i]=dp[n-1][i]*2(1=<i<n),dp[n][n]=1;
最大盘仅仅移动一次,上面盘子先移到B塔,一次,最后由B到目标C重新.。

#include"stdio.h"
#include"string.h"
#include"math.h"
#define N 61
int main()
{
    __int64 i,j,f[N][N];
    f[1][1]=f[2][2]=1;
    f[2][1]=2;
    for(i=3;i<N;i++)
    {
        f[i][i]=1;
        for(j=1;j<i;j++)
        {
            f[i][j]=2*f[i-1][j];
        }
    }
    int T,n,m;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);
        printf("%I64d\n",f[n][m]);
    }
    return 0;
}

汉若塔VI HDU1996
 每一个盘从小到大每一个都有3种选择,共3^n。


#include"stdio.h"
#include"string.h"
#include"math.h"
#define N 61
int main()
{
    int T,n;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        printf("%.0f\n",pow(3.0,n*1.0));
    }
    return 0;
}






转载于:https://www.cnblogs.com/mfmdaoyou/p/7402803.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

汉诺塔系列问题: 汉诺塔II、汉诺塔III、汉诺塔IV、汉诺塔V、汉诺塔VI 的相关文章

  • DPDK Rx flexible descriptor 在Intel E810 网卡中的使用

    什么是Rx flexible descriptor Intel E810系列网卡支持Rx flexible descriptor 这是一种可以通过软件定义格式并配置到网卡硬件中的Rx descriptor 接收描述符 Flexible de
  • 数据提取之lxml

    1 lxml的认识 在前面学习了xpath的语法 那么在代码中我们如何使用xpath呢 对应的我们需要lxml 安装方式 pip install lxml 2 lxml的使用 2 1 lxml模块的入门使用 1 导入lxml 的 etree
  • 4.HLSL Effect(效果框架)

    4 HLSL Effect 效果框架 进行到这里 读者可能会觉得使用着色器多少有些繁琐 Effect 效果框架 被提出以解决这些问题 作为一种方法 Effect简化了使用着色器的操作 作为一个框架 Effect把顶点着色器和像素着色器有机地
  • 11.网络爬虫—多线程详讲与实战

    11 网络爬虫 多线程详讲与实战 程序 进程 线程 线程常用方法 多线程的优点 join 案例 共享全局变量资源竞争 互斥锁 死锁 互斥锁 死锁 多线程实战 某果多线程实战 前言 个人简介 以山河作礼 Python领域新星创作者 CSDN实
  • mysql查询前5条记录_各个数据库中,查询前n条记录的方法

    SQL查询前10条的方法为 1 select top X from table name 查询前X条记录 可以改成需要的数字 比如前10条 2 select top X from table name order by colum name
  • 【Python技巧】(虚拟环境报错、pycharm)无法加载文件 ...\venv\Scripts\activate.ps1,因为在此系统上禁止运行脚本。

    一 问题出现 使用Pycharm设置虚拟环境后 打开终端出现如下报错 无法加载文件 venv Scripts activate ps1 因为在此系统上禁止运行脚本 二 解决方式 已管理员的身份打开powershell终端 然后查询get e
  • c++ main函数调用 类中的枚举_利用Doxygen给C程序生成注释文档

    利用Doxygen为C程序生成注释文档 一 Doxygen工具的安装 利用Doxygen工具生成API帮助文档需要下载安装以下三个软件 1 Doxygen 可以从一套归档源文件开始 生成HTML格式的在线类浏览器 或离线的 LATEX RT
  • 图像去雾算法学习

    现有的图像采集设备对外界环境的干扰非常敏感 在雾霾环境中 获取的户外图像往往退化严重 主要表现为场景特征信息模糊 对比度低 色彩失真 不利于计算机视觉系统对图像真实特征的提取 从而影响其后续的分析 理解 识别等一系列处理 很大程度上降低了视
  • vue3.0安装sass(scss)以及报错解决

    本篇文章主要记录了笔者安装sass的过程 1 安装ruby 首先在官网中下载 https rubyinstaller org downloads 下载之后进行安装 在安装过程中 要记得勾选添加环境变量的选项 其他的就是一直next就可以了
  • jq的核心函数

    jquery的核心函数 1 代表接受一个函数 也就是我们平常用的入口函数 2 接受一个字符串 2 1 接受一个字符串选择器 2 2 接受一个代码片段 3 接受一个dom对象 会被包装成jquery对象返回给我们
  • apk内部存储路径

    首先内部存储路径为 data data youPackageName 下面讲解的各路径都是基于你自己的应用的内部存储路径下 所有内部存储中保存的文件在用户卸载应用的时候会被删除 一 files Context getFilesDir 该方法
  • 数据结构之链栈

    栈介绍 首先 它是一个线性表 准确的说 应该是一个插入 删除受限制的线性表 它仅仅在表尾进行插入和删除操作的线性表 我们把这种受限制的线性表称为栈 如果栈的元素在使用时出现了元素变化不可预测的情况 有时很大 有时又很小 这种情况下 则建议使
  • linux查看jvm内存

    查看内存大小 free h free命令相关知识 判断Java程序对内存的消耗 top top命令相关知识 查看tomcat信息 ps ef grep tomcat 4 1分析内存实例 pid 21069 使用jmap来查看jvm的堆的快照
  • MySQL数据库基本操作

    一 数据库的操作 CURD 重点 1 创建数据库的语法 基本语法 create database 数据库名称 2 查看数据库 show databases 查看所有数据库 use 数据库名称 使用数据库 show create databa
  • Node.js 应用的御用品: Node.js 错误处理系统

    开发中 有些开发者会积极寻求处理错误 力求减少开发时间 但也有些人完全忽略了错误的存在 正确处理错误不仅意味着能够轻松发现和纠正错误 而且还意味着能够为大型应用程序开发出稳健的代码库 特别是对于 Node js 开发人员 他们有时会也发现自
  • 上班一个月,我的几点体会

    这篇博文其实在去年就已经在CSDN发过的 后来 某次误操作不小心删除了 今天找出来重新发一下 我是从3月1号开始上班的 今天3月31号 刚好一个月结束 在这一个月里 我收获不少 感受颇深 现谈谈自己的几点感受 与大家分享 1 由于在学校里做
  • JDBC与MySQL数据库的连接

    一 Jdbc连接池 概念 一个容器 存放数据库连接的容器 好处 节约资源 用户访问高效 规范 1 用连接池管理连接 可以重复利用 2 不是 自己创建连接 而是通过连接池获取连接 3 使用完之后调用连接的close 方法归还连接 不是关闭连接
  • Unity中可用Lua版本效率分析比较

    欢迎来到你的代码我的鱼 oooofish com 本篇文章主要介绍Unity中可用的lua版本对比及分析 目前常见的unity lua库有以下 luainterface ulua nlua unilua 简单介绍 luainterface
  • js一个简单的ajax示例,原生JS简单实现ajax的方法示例

    本文实例讲述了原生JS简单实现ajax的方法 分享给大家供大家参考 具体如下 HTML部分 这里有个input按钮 点击会触发click事件 click事件调用Ajax 方法 JS部分 通过这个函数来异步获取信息 function Ajax
  • lighttpd+fastcgi嵌入式web交叉编译到arm

    文章目录 前提 lighttpd交叉编译安装 源码下载 交叉编译 简单测试 fastcgi编译配置 源码下载 交叉编译生成动态库 修改lighttpd配置 简单测试 c语言fcgi程序 c fcgi程序 gitee仓库链接 参考 前提 环境

随机推荐

  • 【Tools】Windows电脑ipad文件互传

    1 首先要知道windows端的ip和用户名 在命令行 win r 再输入cmd即可打开命令行 输入ipconfig 2 windows端创建一个共享文件夹 随便在电脑上创建一个文件夹 右键创建的文件夹点击属性 再点击共享 3 进入高级共享
  • nvm npm exit status 1:乱码

    node npm nrm nvm 最近要搞vue 之前装了最新的node启动报错 最后值版本问题 查阅资料后用版本管理工具搞好了 npm nrm nvm傻傻分不清 npm node包管理工具 nrm 提供和管理npm包下载地址 nvm no
  • 虚拟机VMware安装Centos7教程

    先安装好VMware 点击该链接进入官网下载 下载后网上找找破解 然后就是安装Centos7了 1 下载Centos7 这里用阿里云的镜像 centos安装包下载 开源镜像站 阿里云 ps 这里再补充贴一下一些镜像地址 哪个快选哪个 最快的
  • 图像对齐(image alignment)

    1 图像对齐的步骤 已知图像A和B 图像对齐的步骤 提取图像A和B的特征 匹配图像A和B中的特征 求解图像A和B的对齐矩阵 2 使用最小二乘求解对齐矩阵的问题 使用最小二乘求解对齐矩阵容易受到outliers的影响 误差会很大 3 RANS
  • Java自学总结之七图形用户接口

    图形用户接口也就是一个人机交互的界面 下面先介绍一下界面的组成 1 JFrame框架 这个是屏幕上的Windows的对象 在创建界面时 这个是首要创建的 如果把设计一个界面比喻为画水彩画 那么它就相当于一个支架 在画画前先安好支架如右图 2
  • win10上运行linux程序吗,Win10新版21364发布: 可直接运行Linux图形程序

    微软竟然一口气把 win 10系统 微软商店 edge 浏览器的最新动向全爆料了 而且还是那种传说级的大更新 大爆料 更新内容 一 Win 10 大更新 今天早上 微软面向Dev通道的推送 Windows 10 新预览版 更新的功能 各位程
  • Java对二维数组排序

    排序规则 首先按照每个一维数组第一个元素进行升序排序 若第一个元素相等 则按照第二个元素进行升序排序 Arrays sort a new Comparator
  • GetManifestResourceStream读取文件失败的解决办法

    这两天在SliverLight项目中碰到一个问题 项目中有一个XML文件 需要使用XMLReader将内容读取出来 使用如下代码 Stream stream this GetType Assembly GetManifestResource
  • 深度学习基础之卷积神经网络

    摘要 受Hubel和Wiesel对猫视觉皮层电生理研究启发 有人提出卷积神经网络 CNN Yann Lecun 最早将CNN用于手写数字识别并一直保持了其在该问题的霸主地位 近年来卷积神经网络在多个方向持续发力 在语音识别 人脸识别 通用物
  • 区块链建立节点(如何建立区块链节点)

    区块链建立节点的方法 区块链是一种分布式的 去中心化的 不可篡改的数据结构 它由一系列按照时间顺序连接的区块组成 每个区块包含一些交易或其他数据 以及一个指向前一个区块的哈希值 区块链的安全性和一致性依赖于网络中的节点 这些节点是运行特定软
  • window.open(),浏览器不要重复弹出新窗口

    项目中有个需求需要弹窗新窗口显示页面 但是又不想浏览器重复弹窗很多个 希望点击按钮后 会自动找到那个浏览器已经打开的页面 window open URL name specs replace window open location ori
  • 归并排序,自顶向下,自底向上

    http blog csdn net cjf iceking article details 7920153
  • 9大代理服务器软件的比较与分析之CCProxy、Squid

    原博客链接 仅用于个人学习记录 代理服务器不仅可以为局域网内的PC提供代理服务 还可以为基于Windows网络的用户提供代理服务 而且代理服务的实现十分简单 它只需在局域网的一台服务器上运行相应的服务器端软件即可 目前代理服务器软件产品主要
  • 谷歌gcp 远程计算机_什么是Google Cloud Platform(GCP)?

    谷歌gcp 远程计算机 Google Cloud Platform is a suite of cloud computing services which is provided by Google Google Cloud Platfo
  • MySQL服务器安装(轻松带你安装)

    文章目录 一 MySQL服务器安装 一 先卸载 二 开始安装 一 MySQL服务器安装 注意事项 1 安装路径不要出现中文 中文符号 2 尽量不要装到C盘 系统盘 安全性高 通常需要管理员权限执行 一 先卸载 我之前已经安装过了 所以我要先
  • 分布式的登录如何实现的

    1 单机登录 user在server上输入用户名密码等 完成用户信息校验并将对应的信息写入server的session中 2 分布式框架的登录方案 使用redis 即通过key value的方式 在server1完成登录后 将用户信息以va
  • 润和HCIP认证套件的烧写问题的终极解决方案

    目录 问题的由来 烧写问题 启动问题 总结 问题的由来 润和HarmonyOS鸿蒙开发板 HiSpark AI Camera开发套件 下图 是OpenHarmony的小型设备和标准设备的代表 基于华为海思Hi3516DV300芯片 支持Li
  • VMware下,私有云平台的配置(CentOS 7系统,含桌面)

    文章目录 实验环境 Windows系统 VMWare 15 1 0 CentOS 7 x86 64 Minimal 1810 iso映像文件 1 安装CentOS系统 2 实现远程桌面连接 实验环境 Windows系统 VMWare 15
  • Tensorflow入门--用tensorflow实现一个三层的神经网络

    前言 这段时间在学习吴恩达的深度学习视频 前面博客中一直在利用numpy自己构造网络框架实现前向传播 损失函数 反向传播 优化等 在这一篇博客中将实现利用tensorflow库里的函数直接实现上面所说的功能 使整个程序更加简洁 最后 如果有
  • 汉诺塔系列问题: 汉诺塔II、汉诺塔III、汉诺塔IV、汉诺塔V、汉诺塔VI

    汉诺塔 汉诺塔II hdu1207 先说汉若塔I 经典汉若塔问题 有三塔 A塔从小到大从上至下放有N个盘子 如今要搬到目标C上 规则小的必需放在大的上面 每次搬一个 求最小步数 这个问题简单 DP a n a n 1 1 a n 1 先把