奇怪汉诺塔【Ybtoj】

2024-01-30 07:38
文章标签 奇怪 汉诺塔 ybtoj

本文主要是介绍奇怪汉诺塔【Ybtoj】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

D e s c r i p t i o n Description Description

汉诺塔问题,条件如下:
1、这里有 A、B、C 和 D 四座塔。
2、这里有 个圆盘, 的数量是恒定的。
3、每个圆盘的尺寸都不相同。
4、所有的圆盘在开始时都堆叠在塔 A 上,且圆盘尺寸从塔顶到塔底逐渐增大。
5、我们需要将所有的圆盘都从塔 A 转移到塔 D 上。
6、每次可以移动一个圆盘,当塔为空塔或者塔顶圆盘尺寸大于被移动圆盘时,可将圆盘移至这座塔上。 请你求出将所有圆盘从塔 A 移动到塔 D,所需的最小移动次数是多少。

I n p u t Input Input

莫得输入。

O u t p u t Output Output

对于每一个整数 n ( 1 ⩽ n ⩽ 12 ) n(1\leqslant n \leqslant 12) n(1n12),输出一个满足条件的最小移动次数,每个结果占一行。

T r a i n Train Train o f of of T h o u g h t Thought Thought

先考虑正常汉诺塔问题(就是只有三座塔)
A k A_k Ak为有 k k k个圆盘的最佳答案
先把 k − 1 k-1 k1个圆盘从A柱移到B柱: A k − 1 A_{k-1} Ak1
然后把第 k k k个圆盘移到C柱:1
再把 k − 1 k-1 k1个圆盘从B柱移到A柱: A k − 1 A_{k-1} Ak1
那么 A k = 2 ∗ A k − 1 + 1 A_k=2 * A_{k-1} + 1 Ak=2Ak1+1
然后在考虑有四座塔
F k F_k Fk
则先将 j j j个圆盘从A柱移到B柱: F j F_j Fj
然后将 k − j k-j kj个圆盘从A柱移到D柱: A k − j A_{k-j} Akj
(也就是普通汉诺塔问题,因为B柱不能放)
再将 j j j个圆盘从B柱移到D柱: F j F_j Fj
那么 F i = m i n j = 0 i ( 2 ∗ F j + A i − j ) F_i=min_{j=0}^{i}(2 * F_j + A_{i-j}) Fi=minj=0i(2Fj+Aij)

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define ll long long 
using namespace std;ll A[15], F[15];int main()
{memset(F, 0x3f, sizeof(F));A[1] = F[1] = 1;for(ll i = 2; i <= 12; ++i)A[i] = 2 * A[i - 1] + 1;for(ll i = 1; i <= 12; ++i){for(ll j = 0; j <= i; ++j)F[i] = min(F[i], 2 * F[j] + A[i - j]);printf("%lld\n", F[i]);}return 0;
}

这篇关于奇怪汉诺塔【Ybtoj】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/659532

相关文章

HDU 2064 汉诺塔III(水题)

题目: http://acm.hdu.edu.cn/showproblem.php?pid=2064 题目大意: 有三根杆,求把n个圆盘从左边移到右边,最少需要移动圆盘的次数。移动规则为大盘不能放在小盘上,比原始的汉诺塔题改变的地方是,只能通过中间的杆往左右两边的杆移动。 心得: 此题心得在题外,不在题内,初看此题,尼玛吓了一跳,好像很难的样子,手贱百度了一下,只注意到俩字“水题”,赶紧

【递推】【DP】-HDU-2064-汉诺塔③

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2064 题目描述:从最左边移到最右边柱子的过程中必须经过中间柱子。 解题思路: 进ACM组时候的考试题,当时虐我的题终于被我虐回来了。。一眼看出方程,1A了。。。呵呵。。满足一下我的虚荣心,,,抚慰一下受挫的心灵吧。 AC代码: #include <iostream>using names

【递推】【DP】-HDU-1996-汉诺塔⑥

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1996 题目描述:问三个柱子上放N个盘子,一共可能有多少种组合?(可以有柱子不放,放的时候依然满足下面盘子比上面盘子大) 解题思路: 对于放N个盘子,ans [ N ] = 3 + 6 * f ( N ) +6 * g ( N ) 这三项依次代表这N个盘子分成一堆,两堆,三堆时有多少种可能。排列

【递推】【DP】-HDU-1995-汉诺塔⑤

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1995 题目描述:计算汉诺塔中某个盘子的移动次数 解题思路: 想了好久,突然顿悟! 思路如下,所谓递推,即是前者与后者存在直接联系,由前者可以直接推出后者,因此必须有一端是已知的,这题里显然最下面的盘子只被动了一次,这就是开端,然后我们考虑紧挨着的两张盘子的递推关系,发现上面盘子是紧挨着的下面盘

【递推】【DP】-HDU-1207-汉诺塔②

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1207 题目描述:四柱汉诺塔 解题思路: 开始想了方程 f [ n ] = 2 * f [n - 2] + 3和 f [ n ] = 2 * f [n - 3] + 7。结果都不对,很郁闷,纠结半天之后,上网查攻略去了,啊!我就差一点了,但也是差了最为关键的一步! 正确的方程应该是: f [

Python 汉诺塔递归原理

# -*- coding: utf-8 -*- # 递归的重点在于放弃,放弃理解和跟踪递归全程的企图,只理解递归两层之间的交接,以及递归的终结条件def move(n, start, mid, end): # n:盘子,start起始区,mid中转区,end终点区if n == 1:print('move', start, '-->', end)else:move(n-1, start, e

CTF入门之奇怪的密码及图形编码总结篇(持续更新中ing)

CTF入门之奇怪的编码及图形编码(持续更新中ing UTF-8,unicode乱码社会主义核心价值观编码:在线解码: 与佛论禅:在线解密网站: 与熊论道:在线网站解密: 兽音:在线网站解密: 文本加密字母/汉字等等:文本加密为汉字 :文本加密为数字:文本加密为字母:文本加密为音乐符号:文本加密为国际音标:文本加密为盲文:文本加密为韩文:文本加密为日文:文本加密为花朵符号:文本加密为俄

迭代和递归(Python)--乘方、最大公约数、汉诺塔、斐波那契、回文字符串

1.迭代 def iterPower(base,exp):result=1.0while exp>0:result*=baseexp-=1return result 运行结果: 2.递归的乘法运算: def recurMul(a,b):if b==1:return aelse:return a+recurMul(a,b-1) 运行结果: 3.递归乘方

青蛙跳台阶与汉诺塔问题

hello,各位小伙伴们上次我们复习了C语言小tip之函数递归,这次我们来使用函数递归来完成青蛙跳台阶和汉诺塔问题! 青蛙跳台阶问题 青蛙跳台阶问题:一只青蛙跳n阶台阶,一次可以跳1阶或者两阶,问有多少种情况! 如果跳1节台阶的话,只有一种情况,如果跳2节台阶的话,有两种情况一次跳一阶,或者一次性跳两阶。如果跳3节台阶的话,可以选择一次跳一节,或者第一次跳一节,第二次跳两节或者第一次跳两节,

奇怪的分式 蓝桥杯

Description 上小学的时候,小明经常自己发明新算法。一次,老师出的题目是:  1/4 乘以 8/5   小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45 (参见图1.png) 老师刚想批评他,转念一想,这个答案凑巧也对啊,真是见鬼! 对于分子、分母都是 1~9 中的一位数的情况,还有哪些算式可以这样计算呢? 请写出所有不同算式的个数(包括题中举例的)。 显然,