【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 ...
随机推荐
- POJ 1082 Calendar Game
Adam and Eve enter this year's ACM International Collegiate Programming Contest. Last night, they pl ...
- 图片拖拽缩放功能:兼容Chrome、Firefox、IE8+
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- php学习笔记6
PHP 字符串变量 PHP 中的字符串变量 字符串变量用于包含有字符的值. 在创建字符串之后,我们就可以对它进行操作了.您可以直接在函数中使用字符串,或者把它存储在变量中. 在下面的实例中,我们创建一 ...
- 《鸟哥的Linux私房菜-基础学习篇(第三版)》(四)
第3章 主机规划与磁盘分区 1. Linux与硬件的搭配 首先谈了认识计算机的硬件配置. 然后谈了选择与Linux搭配的主机配置. 在Linuxserver中,内存的重要性 ...
- leetCode解题报告5道题(十)
题目一:Valid Number Validate if a given string is numeric. Some examples: "0" => true &quo ...
- windows 批处理脚本(batch scripting)
Guide to Windows Batch Scripting DOS 不需对变量事先声明.未声明或未初始化变量是一个空字符串("") 1. 变量赋值 set命令用于变量赋值.s ...
- 1.1 Introduction中 Kafka for Stream Processing官网剖析(博主推荐)
不多说,直接上干货! 一切来源于官网 http://kafka.apache.org/documentation/ Kafka for Stream Processing kafka的流处理 It i ...
- 洛谷 P1230 智力大冲浪
洛谷 P1230 智力大冲浪 题目描述 小伟报名参加中央电视台的智力大冲浪节目.本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每个参赛者m元.先不要太高兴!因为这些钱还不一定都是你的?! ...
- STL之vector容器的实现框架
说明:本文仅供学习交流,转载请标明出处,欢迎转载. 实现vector容器的思路等同于实现一个动态数组,以下我们參照源代码的相关资料,给出一个vector容器的大致框架,仅仅有声明,没给出详细的实现. ...
- 【原创】基于pyautogui进行自动化测试
前期准备: python3.6 pyautogui pywinauto 以下代码实现内容: 1.打开记事本 2.记事本中输入This is a test 3.保存内容 4.退出进程 import py ...