动态规划:汉诺塔问题|循环汉诺塔

server/2025/1/16 7:48:01/

目录

1. 汉诺塔游戏简介

2.算法原理

3.循环汉诺塔


1. 汉诺塔游戏简介

汉诺塔游戏是一个经典的数学智力游戏,其目标是将塔上不同大小的圆盘全部移动到另一个塔上,且在移动过程中必须遵守以下规则:

  • 每次只能移动一个圆盘
  • 较大的圆盘不能放在较小的圆盘之上

2.算法原理

假设是三个塔ABC,A塔上有n个圆盘,求最少需要移动多少次可以将A塔的圆盘全部移到C塔上

设最少移动次数的函数为f(n)

(1)n=1时,只需要一步,直接将A塔上的圆盘移到C塔 即 f(1)= 1

(2)n=2时,,看下图可知 f(2)= 3

(3)n=3时,看下图可知 f(3)= 7

找规律可发现:思路简要如下:将移动步骤分为三步,

a)将最上面的n-1个盘子从A塔移动到B塔上

b)将最大的盘子移动到C塔上

c)再将B塔上的n-1个盘子移动到C塔上

当n=3时:将上面两个圆盘一同移到B塔其实就是n=2时的整个步骤,因为都是将2个圆盘一起移到另一个塔上,那么n=3就可以这样看

a)第1-3步:将上面2个盘放到B塔上,即f(2)步

b)第4步:将最大的盘子移动到C塔上,就+1步

c)第5-7步:将B塔上的2个盘移到C塔上,也是f(2)步

由此推导:n=3时最少移动次数:f(3) = f(2)+1+f(2)=2*f(2)+1

n继续变化推导出:f(n)=2*f(n-1)+1

那么动态规划算法的代码:

 /**** @param n 代表汉诺塔阶数* @return 返回最少移动次数*/public int getHanoi(int n) {if(n == 1) {return 1;}int[] data = new int[n];data[0] = 1;for(int i = 1; i < n; i++){data[i] = data[i-1] + 1 + data[i-1];}return data[n-1];}

3.循环汉诺塔

这题有两问:

(1)把A塔上的所有圆盘都移到B塔所需的最小步数

(2) 把A塔上的所有圆盘都移到C塔所需的最小步数

区别:只能从A->B,B->C,C->A不能随意挪动圆盘

算法原理同上

 上图左:f(2) 图右:g(2) 

移到B塔所需的最小步数:f(n)移到C塔所需的最小步数:g(n)
n=112
n=22+1+2=52+1+1+1+2=7
n=3g(2)+1+g(2)=15g(2)+1+f(2)+1+g(2)=21

此处来分析n=3:怎么找重复子问题

(1)移到B塔所需的最小步数:f(3)

a)将上面2个盘移动C塔:A->B,B->C这个过程其实就是g(2)

b)将最大的盘子移动到B塔上:+1步

c)将C塔上2个盘移动到B塔上:C->A,A->B其实也就是g(2)

(2)移到C塔所需的最小步数:g(3)

a)将上面2个盘移动C塔:A->B,B->C这个过程其实就是g(2)

b)将最大的盘子移动到B塔上:+1步

c)将C塔上面2个盘移动A塔:C->A这个过程其就是f(2)

d)将最大的盘子移动到C塔上:+1步

e)将A塔上面2个盘移动C塔:A->B,B->C这个过程其实就是g(2) 

综上进一步推导:

f(n)= 2*g(n-1)+1

g(n)=2*g(n-1)+f(n-1)+2

代码如下:

import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);int n = in.nextInt();int mod = 1000000007;int x =1,y = 2;for(int i=2;i<=n;i++) {int xx = x,yy=y;x= (2*yy+1) % mod;y = ((2*yy)%mod+2+xx)%mod;}System.out.print(x+" "+y);}
}


http://www.ppmy.cn/server/116423.html

相关文章

音视频入门基础:AAC专题(1)——AAC官方文档下载

一、AAC简介 高级音频编码&#xff08;英语&#xff1a;Advanced Audio Coding&#xff0c;AAC&#xff09;是有损音频压缩的专利数字音频编码标准&#xff0c;由Fraunhofer IIS、杜比实验室、贝尔实验室、Sony、Nokia等公司共同开发。出现于1997年&#xff0c;为一种基于MPEG…

基于SpringBoot+Vue+MySQL的滑雪场管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 在快速发展的冰雪运动热潮下&#xff0c;为了提升滑雪场的管理效率与顾客体验&#xff0c;我们设计并实现了一套基于SpringBoot后端框架、Vue前端框架以及MySQL数据库的滑雪场管理系统。该系统旨在通过数字化手段&#xff0c;优…

MySQL MHA

mysql架构 1、一主一从 2、主主复制&#xff08;M-M双主互备&#xff09;&#xff08;两个主互为主从&#xff09;&#xff08;用得少&#xff09; 可能导致数据隔离性&#xff0c;两边同时修改数据时可能导致数据不一致 2.1 M-M-M 3、一主多从&#xff08;访问量大&#…

【Leetcode:257. 二叉树的所有路径 + 二叉树 + 递归 】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

18、Gemini-Pentest-v1

难度 中 &#xff08;个人认为是高&#xff09; 目标 root权限 一个flag 靶机启动环境为VMware kali 192.168.152.56 靶机 192.168.152.64 信息收集 突破点大概就是web端了 web测试 访问主页直接就是目录遍历 不过进去后是一个正常的网页 简单的试了几个弱口令无果继续信息…

快速完成论文初稿写作的ChatGPT提示词分享

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 随着人工智能技术的迅速发展&#xff0c;ChatGPT已经成为学术写作中不可忽视的工具。它不仅能帮助研究者提高写作效率&#xff0c;还能在初稿撰写过程中提供结构化的建议和内容生成支持…

【Kubernetes知识点问答题】监控与升级 / ETCD 备份与恢复

目录 1. 举例说明 K8s 中都有哪些常规的维护管理操作。 2. 如何升级 K8s 到新的版本&#xff1f;在升级过程中应该注意哪些事项&#xff1f; 3. 解释 ETCD 及其备份和恢复的过程。 1. 举例说明 K8s 中都有哪些常规的维护管理操作。 常见的维护管理操作有&#xff1a; ① 查看…

Unity6 + UE5.4 PSO缓存实践记录

题图&#xff08;取自COD冷战的着色器编译提示&#xff09; PSO&#xff08;管线状态对象 Pipeline State Object&#xff09;是伴随现代图形API&#xff08;DirectX12、Vulkan、Metal&#xff09;而出现的概念&#xff0c;它本质上是单次绘制时渲染管线所处的状态信息的集合&…