AOJ 331.汉诺塔

汉诺塔

Time Limit: 1000 ms   Case Time Limit: 1000 ms   Memory Limit: 64 MB
Total Submission: 892   Submission Accepted: 173

Description

大家都听说过汉诺塔吧?有n个圆盘由小到大排列,套在a柱上,每次只能移动一个圆盘,而且只能大的在下,小的在上,让你把a柱上的圆盘移到b柱,给你一个多余的c柱,问你最少移动多少次才能完成任务。

Input

输入有多组数据,每组包括一个整数n(n<=10000000),表示初始状态下有n个圆盘,当输入的n为0时,程序结束,n为负的情况不作处理。

Output

对每个输入,对应一行输出,每行输出包括一个整数,即移动的最小次数,因为数目非常大,所以请对9973求余后再输出。

Sample Input

Original Transformed
1
2
3
4
0

Sample Output

Original Transformed
1
3
7
15

Hint

采用结构:
……
for(;;){
scanf("%d",&n);
if(n==0)
break;
……
printf(……);
……
}
……

Source

Ccyjava

求n个圆盘的汉诺塔的最少移动次数

找规律得 ans = 2n-1

由于最后要对9973取模,因此使用快速幂取模算法

AC代码:GitHub

 1 //====================================================================
 2 /*
 3 By:OhYee
 4 Github:OhYee
 5 HomePage:http://www.oyohyee.com
 6 Email:[email protected]
 7 Blog:http://www.cnblogs.com/ohyee/
 8
 9 かしこいかわいい?
10 エリーチカ!
11 要写出来Хорошо的代码哦~
12 */
13
14 #include <cstdio>
15 #include <algorithm>
16 #include <cstring>
17 #include <cmath>
18 #include <string>
19 #include <iostream>
20 #include <vector>
21 #include <list>
22 #include <queue>
23 #include <stack>
24 #include <map>
25 using namespace std;
26
27 //DEBUG MODE
28 #define debug 0
29
30 //循环
31 #define REP(n) for(int o=0;o<n;o++)
32
33 typedef long long LL;
34
35 typedef long long LL;
36 LL exp_mod(LL a,LL n,LL b) {
37     LL t;
38     if(n == 0) return 1 % b;
39     if(n == 1) return a % b;
40     t = exp_mod(a,n / 2,b);
41     t = t * t % b;
42     if((n & 1) == 1) t = t * a % b;
43     return t;
44 }
45
46 bool Do() {
47     int n;
48     if(scanf("%d",&n),n == 0)
49         return false;
50     if(n < 0)
51         return true;
52     printf("%lld\n",exp_mod(2,n,9973) - 1);
53     return true;
54 }
55
56 int main() {
57     while(Do());
58     return 0;
59 }
时间: 2024-12-18 02:41:05

AOJ 331.汉诺塔的相关文章

hdu 1207 汉诺塔II (DP+递推)

汉诺塔II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4529    Accepted Submission(s): 2231 Problem Description 经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往

从汉诺塔问题来看“递归”本质

汉诺塔问题 大二上数据结构课,老师在讲解"栈与递归的实现"时,引入了汉诺塔的问题,使用递归来解决n个盘在(x,y,z)轴上移动. 例如下面的动图(图片出自于汉诺塔算法详解之C++): 三个盘的情况: 四个盘的情况: 如果是5个.6个.7个....,该如何移动呢? 于是,老师给了一段经典的递归代码: void hanoi(int n,char x,char y,char z){ if(n == 1) move(x,1,z); else{ hanoi(n-1,x,z,y); move(x,

bzoj1019: [SHOI2008]汉诺塔(dp)

1019: [SHOI2008]汉诺塔 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1739  Solved: 1062[Submit][Status][Discuss] Description 汉诺塔由三根柱子(分别用A B C表示)和n个大小互不相同的空心盘子组成.一开始n个盘子都摞在柱子A上,大的在下面,小的在上面,形成了一个塔状的锥形体. 对汉诺塔的一次合法的操作是指:从一根柱子的最上层拿一个盘子放到另一根柱子的最上层,同时要保证被移动的

汉诺塔(三)

汉诺塔(三) 描述 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔.不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面.僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔.庙宇和众生也都将同归于尽. 现在我们把三根针编号为1,2,3. 所

python 实现汉诺塔问题

代码如下: def hano(n,x,y,z): if n==1: print(x,"->",z) else: #将n-1个盘子从x->y hano(n-1,x,z,y) #将剩余的最后一个盘子从x->z print(x,"->",z) #将剩余的n-1个盘子从y->z hano(n-1,y,x,z) n = int(input("请输入汉诺塔的层数:")) hano(n,"A","B&

NYOJ 93 汉诺塔(三) 【栈的简单应用】

汉诺塔(三) 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描写叙述 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候.在当中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔. 不论白天黑夜,总有一个僧侣在依照以下的法则移动这些金片:一次仅仅移动一片.无论在哪根针上.小片必须在大片上面.僧侣们预言.当全部的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中

汉诺塔的递归算法与解析

从左到右 A  B  C 柱 大盘子在下, 小盘子在上, 借助B柱将所有盘子从A柱移动到C柱, 期间只有一个原则: 大盘子只能在小盘子的下面. 如果有3个盘子, 大中小号, 越小的越在上面, 从上面给盘子按顺序编号 1(小),2(中),3(大), 后面的原理解析引用这里的编号. 小时候玩过这个游戏, 基本上玩到第7个,第8个就很没有耐心玩了,并且操作的动作都几乎相同觉得无聊.  后来学习编程, 认识到递归, 用递归解决汉诺塔的算法也是我除了简单的排序算法后学习到的第一种算法. 至于递归,简单来说

BZOJ 1019: [SHOI2008]汉诺塔

Description 一个汉诺塔,给出了移动的优先顺序,问从A移到按照规则移到另一个柱子上的最少步数. 规则:小的在大的上面,每次不能移动上一次移动的,选择可行的优先级最高的. Sol DP. 倒着DP.但是他有优先级,所以他的方案是唯一的. 状态 \(f[a][i]\) 表示 将 \(a\) 柱上的 \(i\) 个移到,能移动到的柱子上的步数. 他能移动到的柱子也是唯一的,这个可以跟DP一起递推出来. \(g[a][j]\) 表示 将 \(a\) 柱上的 \(i\) 个能移动到的柱子. 然后

汉诺塔-Hanoi

1. 问题来源: 汉诺塔(河内塔)问题是印度的一个古老的传说. 法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔.不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面.僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔.