P1096 Hanoi 双塔问题

题目描述

给定AA、BB、CC三根足够长的细柱,在AA柱上放有2n2n个中间有孔的圆盘,共有nn个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3n=3的情形)。

现要将这些圆盘移到CC柱上,在移动过程中可放在BB柱上暂存。要求:

(1)每次只能移动一个圆盘;

(2)AA、BB、CC三根细柱上的圆盘都要保持上小下大的顺序;

任务:设A_nAn?为2n2n个圆盘完成上述任务所需的最少移动次数,对于输入的nn,输出A_nAn?。

输入输出格式

输入格式:

一个正整数nn,表示在AA柱上放有2n2n个圆盘。

输出格式:

一个正整数, 为完成上述任务所需的最少移动次数A_nAn?。

输入输出样例

输入样例#1: 复制

【输入样例1】
1
【输入样例2】
2

输出样例#1: 复制

【输出样例1】
2
【输出样例2】
6

说明

【限制】

对于50\%50%的数据,1 \le n \le 251≤n≤25

对于100\%100%的数据,1 \le n \le 2001≤n≤200

【提示】

设法建立A_nAn?与A_{n-1}An−1?的递推关系式。

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;
int n,a[610],where=610;
int main(){
    a[1]=1;
    scanf("%d",&n);
    for(int i=2;i<=n;i++){
        for(int k=1;k<=i-1;k++){
        	a[k]*=2;
        }
        for(int k=1;k<=i-1;k++){
        	if(a[k]>=10){
            	a[k]-=10;
            	a[k+1]++;
            }
        }
        a[1]++;
    }
    for(int k=1;k<=690;k++){
        a[k]*=2;
    }
    for(int k=1;k<=690;k++){
        if(a[k]>=10){
            a[k]-=10;
            a[k+1]++;
        }
    }
    while(a[where]==0){
        where--;
    }
    for(int i=where;i>=1;i--){
    	printf("%d",a[i]);
    }
    return 0;
}

  

原文地址:https://www.cnblogs.com/xiongchongwen/p/11188234.html

时间: 2024-11-09 09:59:02

P1096 Hanoi 双塔问题的相关文章

洛谷——P1096 Hanoi双塔问题

https://www.luogu.org/problem/show?pid=1096 题目描述 给定A.B.C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3的情形). 现要将这些圆盘移到C柱上,在移动过程中可放在B柱上暂存.要求: (1)每次只能移动一个圆盘: (2)A.B.C三根细柱上的圆盘都要保持上小下大的顺序: 任务:设An为2n个圆盘完成上述任务所需的最少移动次数,对于输入的n,输出An. 输

b161: NOIP2007 4.Hanoi双塔问题

zerojudge  汉诺塔?图片问度娘 b161: NOIP2007 4.Hanoi双塔问题 题目: 给定A.B.C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3的情形).现要将这些圆盘移到C柱上,在移动过程中可放在B柱上暂存.要求: (1)每次只能移动一个圆盘: (2)A.B.C三根细柱上的圆盘都要保持上小下大的顺序: 任务:设An为2n个圆盘完成上述任务所需的最少移动次数,对于输入的n,输出An.

【算法:2】hanoi双塔

汉诺塔,经典的递归. 经典的汉诺塔游戏相信很多同学都会玩的,规则就不用赘述,百科一下就OK.有三个柱子A,B,C,A柱子上套有n个大小不等的盘子,任意两个盘子,上面的盘子一定小于下面的盘子.现在请你编写程序计算如何将这n个盘子按照规则移到C柱子上,每次只能移动一个盘子,移动过程中可以借助B柱子,任意状态,各个柱子的盘子必须小盘在放在大盘子上面.现在输入两个正整数n,表示有n个盘子,请输出他的每一次移动. #include<iostream> #include<cstdio> #in

[DP][高精][NOIP]Hanoi双塔问题

题目梗概 Hanoi塔问题的基础上,每种圆盘加了一个.实际内容并没有变化. 思考 首先来一波Hanoi问题的步数公式推导: 首先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移动的圆盘个数都是一样的,所以步数就是 (n-1)

codevs 1145 Hanoi双塔问题 2007年NOIP全国联赛普及组

时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 给定A.B.C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3的情形).现要将这些圆盘移到C柱上,在移动过程中可放在B柱上暂存.要求: (1)每次只能移动一个圆盘: (2)A.B.C三根细柱上的圆盘都要保持上小下大的顺序: 任务:设An为2n个圆盘完成上述任务所需的最少移动次数,对于输入的n

【NOIP2007】第四题&#183;Hanoi双塔问题

题目描述 Description 给定A.B.C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3的情形).现要将这些圆盘移到C柱上,在移动过程中可放在B柱上暂存.要求: (1)每次只能移动一个圆盘: (2)A.B.C三根细柱上的圆盘都要保持上小下大的顺序: 任务:设An为2n个圆盘完成上述任务所需的最少移动次数,对于输入的n,输出An. 输入描述 Input Description 为一个正整数n,表示在

[高精度][codevs 1145]Hanoi双塔问题

#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<cmath> #define maxn 2000 #define base 10000 using namespace std; int n; struct Bign { int c[maxn],len,sign; //初始化 Bign(){memset(c,0,sizeof(c))

搜索专讲

搜索专讲 Tags:搜索 https://www.zybuluo.com/xzyxzy/note/1058215 前言 做一个专题肯定是要花点时间的 但是哇,搜索怎么这么多内容?!WTF?! 好吧慢慢刷,待四五月份左右出pdf或ppt的讲义吧 先把题目放上,大家愿意的和我一起做吧 题目 李老师给了一个包 广搜 [x] ?POJ1426-Find The Multiple https://vjudge.net/problem/POJ-1426 [x] POJ2251-Dungeon Master

C2第十次解题报告

看过题解后如果觉得还算有用,请帮忙加点我所在团队博客访问量 http://www.cnblogs.com/newbe/ http://www.cnblogs.com/ne走迷宫wbe/p/4069834.html http://www.cnblogs.com/newbe/p/4072005.html 求赞求祝福啊!!! http://www.cnblogs.com/newbe/p/4058097.html 软工老师太狠心,明明做了那么多展示却比别的队差了约100分....还请可怜一下同课不同命的