一.        题意:

算出汉诺塔移动序列中对应位置的号码,数据规模很大,所以不能单纯递归,而是要找出汉诺塔序列的规律。

二.        汉诺塔数列

为了得出最少的移动步数,当n为偶数时,最上层小盘子首先移动到过渡柱上;当n为奇数时,最上层小盘子首先移动到目标柱上。不论n为奇偶,过渡柱和目标柱上,盘子的叠加编号始终是奇偶叠加,不会出现奇数或偶数连续叠加。

这里的规律是:

第 n 项 = n 能被 2 整除的次数 + 1。 (需要用高精度)

汉诺塔数列例子:

盘子个数

数列

至少需要步数

N = 1

1

21-1=1

N = 2

121

22-1=3

N = 3

1213121

23-1=7

N = 4

121312141213121

24-1=15

操作步骤:

当n=1时:将盘子从A柱直接移到C柱,完成移动,即(A→C)。当n=2时:先把n-1=1个盘子从A柱移动到B柱,再将A柱上最后一个盘子从A柱移动到C柱,最后将B柱上的n—1个盘子从B柱移动到C柱上,完成移动,即A→B,A→C,B→C。

当n=3时:先把n-1=2个盘子从A柱移动到B柱(借助C),再将B柱上剩余的盘子移动到C柱(借助A)。

当n为任意正整数时:同样是先把n-1个盘子从A柱移动到B柱(借助C),方法与上述相同。

通过以上分析,Hanoi问题是典型的利用递归来解决的,是将规模为n的问题,降解为规模为n-1的小问题、n-2的较小问题……依次降解,直到递归出口,求出最低阶规模的解,代入高一阶问题中,直至求出规模为n的问题的解。递归包括回溯和递推两个过程。

为了分辨n个不同的盘子,将其由小到大依序编号为1,2,3,…,n-1,n,以便于研究其所需的移动次数及次序、探求其规则性。

从n=1、n=2的移动情况,可归纳出一个结论:即n=2时处理n=1两次,共须移动22-1=3步,其Hanoi数列为121。同理可知n=3时,处理n=2两次,共须移动23-1=7步,其Hanoi数列为1213121,同理可知n=4时,处理n=3两次,总共须移动24-1=15步,其汉诺塔数列为121312141213121,依此类推。

分析得出递归模型:

f(1)=1(n=1)

f(n)=2×f(n-1)+1(n>1→)

f(n)=2×f(n-1)+1

=2×(2×f(n-2)+1)+1

=2×(2×(2×f(n-3)+1)+1)+1……

=2n-1。

因此,n个盘子总共需移动最少步数计算公式为:f(n)=2n-1。

很容易看出对于n个盘子的汉诺塔的移动步骤为s(n+1)=s(n)(n+1)s(n),假设输入为p。则L(n)=2^n-1,L(n)表示n个盘子的汉诺塔的移动步骤的数目。假如p=2^n,则结果是n+1;否则可找出一个最小的n,使得p<=2^n-1。并且p>2^(n-1),否则p<=2^(n-1),由对称性知f(p)=f(p-2^(n-1)),即减去不超过P的2的最大次幂,这样一直减下去直至p=2^x.所以结果为最初始的p表示为2进制数后从右边数起的0的个数加1.

三.        代码

 //
// main.cpp
// sicily-1028
//
// Created by ashley on 14-11-7.
// Copyright (c) 2014年 ashley. All rights reserved.
// #include <iostream>
#include <string>
using namespace std; int counting(string data)
{
int sum = ;
int length = (int)data.length();
for (int i = ; i < length; i++) {
data[i] = data[i] - '';
}
while (data[length - ] % == ) {
for (int i = ; i < length; i++) {
if (i + < length) {
int b = data[i + ];
data[i + ] = (data[i] % ) * + b;
}
data[i] = data[i] / ;
}
sum++;
}
return sum + ;
} int main(int argc, const char * argv[])
{
int cases;
string number;
cin >> cases;
int counter = ;
while (counter != cases) {
cin >> number;
counter++;
cout << "Case " << counter << ": " << counting(number) << endl;
if (counter < cases) {
cout << endl;
}
}
return ;
}

Sicily-1028的更多相关文章

  1. sicily 中缀表达式转后缀表达式

    题目描述 将中缀表达式(infix expression)转换为后缀表达式(postfix expression).假设中缀表达式中的操作数均以单个英文字母表示,且其中只包含左括号'(',右括号‘)’ ...

  2. 【JSOI2007】麻将 bzoj 1028

    Description 麻 将是中国传统的娱乐工具之一.麻将牌的牌可以分为字牌(共有东.南.西.北.中.发.白七种)和序数牌(分为条子.饼子.万子三种花色,每种花色各有一到 九的九种牌),每种牌各四张 ...

  3. sicily 1934. 移动小球

    Description 你有一些小球,从左到右依次编号为1,2,3,...,n. 你可以执行两种指令(1或者2).其中, 1 X Y表示把小球X移动到小球Y的左边, 2 X Y表示把小球X移动到小球Y ...

  4. Light OJ 1028 - Trailing Zeroes (I) (数学-因子个数)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1028 题目大意:n除了1有多少个因子(包括他本身) 解题思路:对于n的每个因子 ...

  5. hdu acm 1028 数字拆分Ignatius and the Princess III

    Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K ...

  6. poj 1028

    http://poj.org/problem?id=1028 题意(水):做一个游览器的历史记录. back:后退到上一个页面,当上一个页面没有时,输出ignored. forward:向前一个页面, ...

  7. ACM: HDU 1028 Ignatius and the Princess III-DP

     HDU 1028 Ignatius and the Princess III Time Limit:1000MS     Memory Limit:32768KB     64bit IO Form ...

  8. hdu 1028 Ignatius and the Princess III 简单dp

    题目链接:hdu 1028 Ignatius and the Princess III 题意:对于给定的n,问有多少种组成方式 思路:dp[i][j],i表示要求的数,j表示组成i的最大值,最后答案是 ...

  9. NBUT 1028 该减肥了(简单递推)

    [1028] 该减肥了 时间限制: 1000 ms 内存限制: 65535 K 问题描述 由于长期缺乏运动,Teacher Xuan发现自己的身材臃肿了许多,于是他想健身,更准确地说是减肥.Teach ...

  10. PAT乙级 1028. 人口普查(20)

    1028. 人口普查(20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 某城镇进行人口普查,得到了全体居民的 ...

随机推荐

  1. BZOJ 3774: 最优选择( 最小割 )

    最小割...二分染色然后把颜色不同的点的源汇反过来..然后就可以做了. 某个点(x,y): S->Id(x,y)(回报), Id(x,y)->T(代价), Id(i,j)&& ...

  2. Hive Map 端OOM 异常

    怪异现象:数据量不大,且不是Reduce端OOM,是Map端OOM Map Task运行的时候数据流中包含了非法字符例如:EOF.NOP等东西,导致BufferedReader读取和StreamDec ...

  3. JQuery实战学习--在dreamweaver 8中配置Jquery自动提示

    最近在学习jQuery,然后在网上找到了自动提示的方法,记之. 1,首先下载jQuery_API.mxp这个扩展文件. 2,打开DW,点击命令-->扩展管理-->文件-->安装扩展, ...

  4. PHP查询MYSQL表的主键

    $sql = "SELECT * from Person"; $result = mysql_query($sql,$con); while ($property = mysql_ ...

  5. python自学笔记(一)简单了解python

    脚本解释型语言的内部机制 python先将脚本编译成字节码文件(pyc,pyo) python虚拟机解释并运行字节码文件 编译型语言的内部机制 先将源代码编译成机器码(机器能读懂的代码),生成可执行文 ...

  6. 在Linux下使用iconv转换字符串编码

    在Linux下写C程序,尤其是网络通信程序时经常遇到编码转换的问题,这里要用到iconv函数库. iconv函数库有以下三个函数 123456 #include <iconv.h>icon ...

  7. 让.net程序自动运行在管理员权限下

    原文:让.net程序自动运行在管理员权限下 如何让.net程序自动运行在管理员权限下 VS2010 c# 编译的WINFORM程序 在Win7 以管理员身份运行 windows 7和vista提高的系 ...

  8. BASE64URL解析

    BASE64URL是一种在BASE64的基础上编码形成新的加密方式,为了编码能在网络中安全顺畅传输,需要对BASE64进行的编码,特别是互联网中. BASE64URL编码的流程: .明文使用BASE6 ...

  9. hihoCoder 1388 Periodic Signal(FFT)

    [题目链接] http://hihocoder.com/problemset/problem/1388 [题目大意] 给出A数列和B数列,求下图式子: [题解] 我们将多项式拆开,我们可以得到固定项A ...

  10. 利用BP神经网络预测水道浅滩演变

    论文 <基于现代技术的河道浅滩演变研究> 利用BP神经网络来预测浅滩演变 BP输出因子:浅滩的年平均淤积厚度以及浅滩上最小水深,是反映浅滩变化的两个基本指标,是确定浅滩航道尺度能否满足航行 ...