zoukankan      html  css  js  c++  java
  • P1096 $Hanoi$双塔问题

    原题地址

    题目描述

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

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

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

    (2)A、B、C三根细柱上的圆盘都要保持上小下大的顺序;

    任务:设An2n个圆盘完成上述任务所需的最少移动次数,对于输入的n,输出An

    输入输出格式

    输入格式:

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

    输出格式:

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

    输入输出样例

    输入样例#1: 
    【输入样例1】
    1
    【输入样例2】
    2
    输出样例#1: 
    【输出样例1】
    2
    【输出样例2】
    6

    说明

    【限制】

    对于50%的数据,1n25

    对于100%的数据,1n200


    思路

    通过模拟1-5,你可以发现一个关系式a[i]=(2i-1)*2。

    只需要将a数组求出即可(不需用数组,直接求a[i])。

    数据n很大,去要用高精乘和高精加。


    高精乘代码

        for(int i=1;i<=n+1;i++){
            for(int j=1;j<=a[0];j++){
                a[j]=a[j]*2+jw;
                jw=a[j]/10;
                a[j]=a[j]%10;
            }
            while(jw!=0){
                a[0]++;
                a[a[0]]=jw%10;
                jw=jw/10;
            }
        }

    高精加代码

    j=0;
        while(true){
            j++;
            a[j]=a[j]-2-qw;
            jw=0;
            while(a[j]<0){
                qw++;
                a[j]=a[j]+10;
            }
            if((j=a[0])||(qw=0)) break;
        }
        if(qw!=0){
            a[0]++;
            a[a[0]]=qw;
        }        

    代码

    #include<iostream>
    #include<cstring>
    using namespace std;
    int n;
    int a[1000];
    int jw,qw,j;
    int main(){
        cin>>n;
        a[0]=1;
        a[1]=1;
        
        for(int i=1;i<=n+1;i++){
            for(int j=1;j<=a[0];j++){
                a[j]=a[j]*2+jw;
                jw=a[j]/10;
                a[j]=a[j]%10;
            }
            while(jw!=0){
                a[0]++;
                a[a[0]]=jw%10;
                jw=jw/10;
            }
        }
        
        
        j=0;
        while(true){
            j++;
            a[j]=a[j]-2-qw;
            jw=0;
            while(a[j]<0){
                qw++;
                a[j]=a[j]+10;
            }
            if((j=a[0])||(qw=0)) break;
        }
        if(qw!=0){
            a[0]++;
            a[a[0]]=qw;
        }        
        for(int i=a[0];i>=1;i--)
            cout<<a[i];
        return 0;
    } 
  • 相关阅读:
    Asp.net Mvc中MVCContrib中无法使用Castle的发解决方案
    Asp.net Mvc Framework 十(测试方法及Filter的示例)
    无注册表的COM调用
    Direct3D 9学习笔记(13)网格(Mesh)4
    Direct3D 9学习笔记(11)网格(Mesh)2
    ATL 核心COM继承类之IDispatchImpl及调用
    ATL 核心COM继承类之CComObjectRootEx及CComObjectLock
    Direct3D 9学习笔记(12)网格(Mesh)3
    ATL COM类之激活
    ATL 引用计数线程模型
  • 原文地址:https://www.cnblogs.com/zhouxuanbodl/p/10388643.html
Copyright © 2011-2022 走看看