【9107】Hanoi双塔问题(NOIP2007)
Time Limit: 10 second
Memory Limit: 2 MB
问题描述
给定A,B,C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的。现要将这些圆盘移到C柱上,在移动过程中可放在B柱上暂存。要求:
(1)每次只能移动一个圆盘;
(2) A、B、C三根细柱上的圆盘都要保持上小下大的顺序;
任务:设An为2n个圆盘完成上述任务所需的最少移动次数,对于输入的n,输出An。
Input
输入为一个正整数n,表示在A柱上放有2n个圆盘
Output
输出仅一行,包含一个正整数,为完成上述任务所需的最少移动次数An。(最后用换行结束)
Sample Input
1
Sample Output
2
Sample Input2
2
Sample Output2
6
【题解】
先不考虑有相同圆盘的情况。
即n个不同的圆盘。
则需要把n-1个圆盘从a->b,然后把a上剩余的一个圆盘从a->c。然后把b上的n-1个圆盘从b->c。
这里的两步:把n-1个圆盘从a->c,和n-1个圆盘从b->c.所需要的步骤数。实际上就是把n-1个圆盘从a移动到c的步骤数*2,因为是等价的。从a->b和从b->c移动的圆盘个数都是一样的,这样。
然后还要多一步就是把a上的一个圆盘放到c。
所以得到递推式。(没有相同的圆盘。然后是n个不是2*n个的递推式)
An表示把n个圆盘从a到c的步骤数。
An=A(n-1)*2+1;
然后玩一下数学游戏。
An=A(n-1)*2+2-1;
An+1=A(n-1)*2+2;
An+1=2(A(n-1)+1)
令Bn = (An+1);
则Bn是一个等比数列。
A1只有把1个圆盘从a移到c,步骤为1
B1=A1+1 = 2;
所以Bn=2^n
然后An=2^n-1;
现在考虑有重复圆盘的情况。
其实只要乘上2就可以了。。
比如n==1.
A上有两个相同的圆盘。那就全都拿到C就好了。
只不过要多移动一次了而已。
然后每种圆盘都要多移动一次
设Dn为2*n个圆盘(n种)要从a移动到c的步骤数。
Dn=2*An=2^(n+1)-2;
然后n可能很大。要用高精度。
写一下高精度乘法即可。
【代码】
//2^(n+1)-2;
#include <cstdio> int n, a[1000] = { 0 };//a数组用来存高精度的各个位上的数字。 void input_data()
{
scanf("%d", &n);
} void get_ans()
{
a[0] = 1;
a[1] = 1;//2^0 == 1;
for (int i = 1; i <= n + 1; i++) //然后乘上n+1个2.
{
int x = 0;
for (int j = 1; j <= a[0]; j++)//把每一位都乘上2.
{
a[j] = a[j] * 2 + x; //边乘边进位。
x = a[j] / 10;
a[j] = a[j] % 10;
}
while (x > 0) //可能要扩展位数。
{
a[0]++;
a[a[0]] = x % 10;
x = x / 10;
}
}
a[1] -= 2;//直接减去2就好。不会出现要退位的情况。
//因为2的x次方除了2的0次方之外。其他的个位数字上的数字都大于等于2.这样。
} void output_ans()
{
for (int i = a[0]; i >= 1; i--) //倒序输出所有位上的数字。
printf("%d", a[i]);
} int main()
{
input_data();
get_ans();
output_ans();
return 0;
}
【9107】Hanoi双塔问题(NOIP2007)的更多相关文章
- b161: NOIP2007 4.Hanoi双塔问题
zerojudge 汉诺塔?图片问度娘 b161: NOIP2007 4.Hanoi双塔问题 题目: 给定A.B.C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都 ...
- noip普及组2007 Hanoi双塔问题
Hanoi双塔问题 描述 给定A,B,C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的.现要将这些圆盘移到C柱上,在移动 ...
- Hanoi双塔问题(递推)
Hanoi双塔问题 时间限制: 1 Sec 内存限制: 128 MB提交: 10 解决: 4[提交][状态][讨论版][命题人:外部导入] 题目描述 给定A,B,C三根足够长的细柱,在A柱上放有2 ...
- 洛谷 P1096 Hanoi双塔问题
P1096 Hanoi双塔问题 题目描述 给定A.B.C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3的情 ...
- [高精度]P1096 Hanoi 双塔问题
Hanoi 双塔问题 题目描述 给定A.B.C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3的情形). 现 ...
- 【NOIP2007】Hanoi双塔问题
题目描述 给定A.B.C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3的情形). 现要将这些圆盘移到C柱上 ...
- hanoi双塔
汉诺塔,经典的递归. 经典的汉诺塔游戏相信很多同学都会玩的,规则就不用赘述,百科一下就OK.有三个柱子A,B,C,A柱子上套有n个大小不等的盘子,任意两个盘子,上面的盘子一定小于下面的盘子.现在请你编 ...
- 洛谷——P1096 Hanoi双塔问题
https://www.luogu.org/problem/show?pid=1096 题目描述 给定A.B.C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个 ...
- LFYZ-OJ ID: 1011 hanoi双塔问题
思路 虽然每种大小盘子数量为2,但对总步数的影响只是一个简单的倍数关系而已,递推关系很容易可以总结出来:an=an-1+2+an-1=2(an-1+1),n=1时,a1=2.故递推的过程就是从a1=2 ...
随机推荐
- DTU(用于将串口数据转换为IP数据或将IP数据转换为串口数据通过无线通信网络进行传送的无线终端设备)
DTU (Data Transfer unit),是专门用于将串口数据转换为IP数据或将IP数据转换为串口数据通过无线通信网络进行传送的无线终端设备.DTU广泛应用于气象.水文水利.地质等行业.
- 【Codeforces Round #455 (Div. 2) C】 Python Indentation
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 一个for循环之后. 下一个写代码的地方一是从(x+1,y+1)开始的 然后如果写完了一个simple statement 下次就有 ...
- BZOJ 3732 Network Kruskal+倍增LCA
题目大意:给定一个n个点m条边的无向连通图.k次询问两点之间全部路径中最长边的最小值 NOIP2013 货车运输.差点儿就是原题...仅仅只是最小边最大改成了最大边最小.. . 首先看到最大值最小第一 ...
- Akka边学边写(4)-- MiniRPG
前面几篇文章用Akka写了HelloWorld和EchoServer,为了更进一步学习Akka,本文将会实现一个非常小的RPG游戏server:MiniRPG. 游戏逻辑 由于是迷你RPG,所以逻辑非 ...
- 1.2 Use Cases中 Event Sourcing官网剖析(博主推荐)
不多说,直接上干货! 一切来源于官网 http://kafka.apache.org/documentation/ Event Sourcing 事件采集 Event sourcing is a st ...
- Android 设置背景透明度
一些时候,我们须要为UI页面设置背景色,例如以下图所看到的: 上图已注: 背景颜色为#000000,透明度为40%: 那么.怎样在代码中表示呢? 首先须要了解: 颜色和不透明度 (alpha) 值以十 ...
- 关于js盒子模型的知识梳理
盒子模型 JS盒子模型中的13个常用属性: clientWidth/clientHeight:可视区域的宽高,宽高+PADDING组成 clientTop/clientLeft:上边框和左边框的宽度 ...
- Docker使用Dockerfile创建Centos(tomcat+jdk)镜像
原文链接:https://blog.csdn.net/qq_37936542/article/details/80824389 Docker构建镜像的方法主要有两种: (1)使用docker c ...
- [React] Style the body element with styled-components and "injectGlobal"
In this lesson, we see how we can apply styles globally with the "injectGlobal" helper met ...
- 算法-对分查找(二分查找)C++实现
这个是个主要的查找算法.由于仅仅是把数读入就须要(N)的时间量,因此我们在说这类问题的时候都是如果读入过的. 在算法经常使用的时间.将问题缩小为一部分(大约1/2),那么我们就觉得这个算法是O(log ...