题目网址 :http://acm.nyist.net/JudgeOnline/problem.php?pid=89

汉诺塔问题的经典结论:

把i个盘子从一个柱子整体移到另一个柱子最少需要步数是 2的i次方减一。那我们这个给定一个初始局面,求他到目标局面(全部移到第三个柱子上)需要的最少步数。怎么办呢!! 分析:

1、总的来说一定是先把最大的盘子移到第三个柱子上, 然后再把第二大的移到柱子3上, 然后再把第三大的盘子移到柱子3上.........直到把最小的盘子(1号盘子)移到柱子3上,才算结束。

2、现在设想一下,在移动第k个盘子动作前,柱子上的整体情况, 假设盘子k在柱子1上, 要移到柱子3上, 由于那些比k大的盘子都已经移动完了,就不需要考虑了。那么此时那些所有比k小的盘子都应该在柱子2上,因为他们不能在柱子1、3上,并且此时柱子2上的盘子从上到下盘子编号依次为1,2, 3.......k-1。

3、找出最大的盘子,先从最大的盘子开始移动, 如果最大的盘子已经在柱子3(目标柱子)上那就不用移动了。 所以我们应该找出不在柱子3上的最大盘子。

4、我们在这里先说一下这个函数ac(i, x)表示前i个盘子全部移到地x个柱子上所需的最少步数。那k个盘子(在柱子1上)举例:把盘子k移到柱子3上前一瞬间柱子上的情况是 :1到k-1个盘子都在柱子2上, k在1上。ac(k-1, 2)就是移动到之一状态所需的步数。此时k移到柱子3需要1步。 要想把所有盘子移到3上,还需将2上 1~k-1 个盘子全部移到柱子3上。 又已知经典汉诺塔结论 移动k-1个盘子需要2的k-1次幂减一。 那么也就得出总共需要步数为:ac(k-1, 2) + 1 + pow(2, k-1) - 1 = ac(k-1, 2) + pow(2, k-1);

#include<iostream>
#include<cstdio>
#include<string.h>
#include<math.h>
using namespace std; long long ans, a[][];
int t, n, mx, star[];
long long ac(int x, int t)
{
if(x == )
{
if(star[x] == t)
return ;
else
return ;
}
if(a[x][t] != -) return a[x][t];
if(star[x] == t)//如果第x个盘子已经在目标柱子上了那就不移动了, 直接考虑移动下一个
a[x][t] = ac(x-, t);
else
a[x][t] = ac(x-, -t-star[x]) + pow(, x-);
//三个盘子编号总和6, 不能在目标柱t子上, 又不能和要移动的盘子x在一个柱子, 只能在6-t-satr[x]上
return a[x][t];
}
int main()
{
cin >> t;
while(t--)
{
memset(a, -, sizeof(a));
scanf("%d", &n);
mx = ;
for(int i = ; i <= n; i++)
{
scanf("%d", &star[i]);
if(i > mx && star[i] != )
mx = i;
}
if(mx == )
printf("0\n");
else if(mx == )
printf("1\n");
else if(mx > )
{
ans = ac(mx-, -star[mx]);
ans += pow(, mx-);
printf("%ld\n", ans);
}
}
return ;
}

nyoj89 汉诺塔(二)的更多相关文章

  1. 算法笔记_013:汉诺塔问题(Java递归法和非递归法)

    目录 1 问题描述 2 解决方案  2.1 递归法 2.2 非递归法 1 问题描述 Simulate the movement of the Towers of Hanoi Puzzle; Bonus ...

  2. "递归"实现"约瑟夫环","汉诺塔"

    一:约瑟夫环问题是由古罗马的史学家约瑟夫提出的,问题描述为:编号为1,2,-.n的n个人按顺时针方向围坐在一张圆桌周围,每个人持有一个密码(正整数),一开始任选一个正整数作为报数上限值m,从第一个人开 ...

  3. bzoj1019 [SHOI2008]汉诺塔

    1019: [SHOI2008]汉诺塔 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1030  Solved: 638[Submit][Status] ...

  4. 汉诺塔的问题:4个柱子,如果塔的个数变位a,b,c,d四个,现要将n个圆盘从a全部移到d,移动规则不变

    四柱汉诺塔问题的求解程序.解题思路:如a,b,c,d四柱. 要把a柱第n个盘移到目标柱子(d柱),先把上层 分两为两部份,上半部份移到b柱,下半部分移到c柱,再把第n盘移到 目标柱子,然后,c柱盘子再 ...

  5. C语言数据结构----递归的应用(斐波拉契数列、汉诺塔、strlen的递归算法)

    本节主要说了递归的设计和算法实现,以及递归的基本例程斐波拉契数列.strlen的递归解法.汉诺塔和全排列递归算法. 一.递归的设计和实现 1.递归从实质上是一种数学的解决问题的思维,是一种分而治之的思 ...

  6. 化繁为简 经典的汉诺塔递归问题 in Java

    问题描述   在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔.不论白天黑 ...

  7. 四柱加强版汉诺塔HanoiTower----是甜蜜还是烦恼

    我想很多人第一次学习递归的时候,老师或者书本上可能会举汉诺塔的例子. 但是今天,我们讨论的重点不是简单的汉诺塔算法,而是三柱汉诺塔的延伸.先来看看经典的三柱汉诺塔. 一.三柱汉诺塔(Hanoi_Thr ...

  8. JavaScript递归函数解“汉诺塔”

    “汉诺塔”是一个著名的益智游戏.塔上有3根柱子和一套直径各不相同的空心圆盘.开始时柱子上的所有圆盘都按照从小到大的顺序堆叠.目标是通过每次移动一个圆盘到另一根柱子,最终把一堆圆盘移动到目标柱子上,过程 ...

  9. python中关于汉诺塔问题和使用turtle库实现其搬运过程

    一.汉诺塔问题 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按 ...

随机推荐

  1. MongoDB之三(高级操作 聚合、游标)

    一: 聚合 常见的聚合操作跟sql server一样,有:count,distinct,group,mapReduce. <1> count count是最简单,最容易,也是最常用的聚合工 ...

  2. POJ 1773 Parity game 带权并查集

    分析:带权并查集,就是维护一堆关系 然后就是带权并查集的三步 1:首先确定权值数组,sum[i]代表父节点到子节点之间的1的个数(当然路径压缩后代表到根节点的个数) 1代表是奇数个,0代表偶数个 2: ...

  3. 【转】CUDA5/CentOS6.4

    转载自http://wenzhang.baidu.com/article/view?key=076f36658dd0828c-1393896446 This article explains how ...

  4. Linux SCP 命令: 利用SSH传输文件

    在linux下一般用scp这个命令来通过ssh传输文件. 1.从服务器上下载文件scp username@servername:/path/filename /var/www/local_dir(本地 ...

  5. 【wuzhicms】apache 设置禁止访问某些文件或目录

    [apache配置禁止访问] 1. 禁止访问某些文件/目录 增加Files选项来控制,比如要不允许访问 .inc 扩展名的文件,保护php类库: <Files ~ "\.inc$&qu ...

  6. 利用 SerialPort 控件实现 PC 串口通信

    整理参考自<Visual C#.NET 串口通信及测控应用典型实例>1.3 节 以及 一篇博文:C# 串口操作系列(1) -- 入门篇,一个标准的,简陋的串口例子. 硬件部分 如果是两个串 ...

  7. CodeForces 361B Levko and Permutation

    题意:有n个数,这些数的范围是[1,n],并且每个数都是不相同的.你需要构造一个排列,使得这个排列上的数与它所在位置的序号的最大公约数满足 > 1,并且这些数的个数恰好满足k个,输出这样的一个排 ...

  8. HW2.5

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...

  9. HDU3727 - Jewel(主席树)

    题目大意 对一个序列进行以下四种操作: 1.Insert x 在序列尾部插入x 2.Query_1 s t k 查询区间[s,t]的第k小 3.Query_2 x 查询x的在序列中排名 4.Query ...

  10. IntelliJ IDEA的下载、安装和WordCount的初步使用(本地模式和集群模式)

    包括: IntelliJ IDEA的下载  IntelliJ IDEA的安装 IntelliJ IDEA中的scala插件安装 用SBT方式来创建工程 或 选择Scala方式来创建工程 本地模式或集群 ...