HDU 1996 汉诺塔VI

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1996

n个盘子的汉诺塔问题的最少移动次数是2^n-1,即在移动过程中会产生2^n个系列。由于 
发生错移产生的系列就增加了,这种错误是放错了柱子,并不会把大盘放到小盘上,即各柱 
子从下往上的大小仍保持如下关系 : 
n=m+p+q 
a1>a2>...>am 
b1>b2>...>bp 
c1>c2>...>cq 
计算所有会产生的系列总数.

Input包含多组数据,首先输入T,表示有T组数据.每个数据一行,是盘子的数 
目N<30.Output对于每组数据,输出移动过程中所有会产生的系列总数。Sample Input

3
1
3
29

Sample Output

3
27
68630377364883

题解:每个盘子都有三种选择,所以是3的n方
 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstring>
 4 #include <cstdio>
 5 #include <vector>
 6 #include <cstdlib>
 7 #include <iomanip>
 8 #include <cmath>
 9 #include <ctime>
10 #include <map>
11 #include <set>
12 #include <queue>
13 using namespace std;
14 #define lowbit(x) (x&(-x))
15 #define max(x,y) (x>y?x:y)
16 #define min(x,y) (x<y?x:y)
17 #define MAX 100000000000000000
18 #define MOD 1000000007
19 #define pi acos(-1.0)
20 #define ei exp(1)
21 #define PI 3.141592653589793238462
22 #define INF 0x3f3f3f3f3f
23 #define mem(a) (memset(a,0,sizeof(a)))
24 typedef long long ll;
25 ll gcd(ll a,ll b){
26     return b?gcd(b,a%b):a;
27 }
28 bool cmp(int x,int y)
29 {
30     return x>y;
31 }
32 const int N=10005;
33 const int mod=1e9+7;
34 int main()
35 {
36     int t;
37     cin>>t;
38     while(t--){
39         int n;
40         ll m;
41         cin>>n;
42         m=pow(3,n);
43         cout<<m<<endl;
44     }
45     return 0;
46 }
时间: 2024-10-21 04:00:59

HDU 1996 汉诺塔VI的相关文章

HDU 1996 汉诺塔VI (排列组合)

题意:... 析:每次都是有三种放法,1,2,3,根柱子,所以就是3^n次方. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib> #include <cmath> #include <iostream> #include <cstring&

ID 1996 汉诺塔VI

Problem Description n个盘子的汉诺塔问题的最少移动次数是2^n-1,即在移动过程中会产生2^n个系列.由于发生错移产生的系列就增加了,这种错误是放错了柱子,并不会把大盘放到小盘上,即各柱子从下往上的大小仍保持如下关系 : n=m+p+q a1>a2>...>amb1>b2>...>bpc1>c2>...>cq计算所有会产生的系列总数. Input 包含多组数据,首先输入T,表示有T组数据.每个数据一行,是盘子的数目N<30.

HDU ACM 1996 汉诺塔VI

分析:每个盘子都可以放到三个柱子上的任意一个,所以是3^n. #include<iostream> using namespace std; int main() { __int64 num[31]={1}; int i,t,n; for(i=1;i<=30;i++) num[i]=num[i-1]*3; scanf("%d",&t); while(t--) { scanf("%d",&n); printf("%I64d\

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 经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往

HDU1996 汉诺塔VI

问题链接:HDU1996 汉诺塔VI.水题,用C语言编写程序. 本题实际上是计算3^n.编程中需要注意输出格式. AC的C语言程序如下: /* HDU1996 汉诺塔VI */ #include<stdio.h> #include<math.h> int main (void) { int t, n; scanf("%d",&t); while(t--) { scanf("%d", &n); printf("%.lf

HDU1996 汉诺塔VI 【递推】

汉诺塔VI Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 1374    Accepted Submission(s): 984 Problem Description n个盘子的汉诺塔问题的最少移动次数是2^n-1,即在移动过程中会产生2^n个系列.由于 发生错移产生的系列就增加了,这种错误是放错了柱子,并不会把大盘放到小盘上,即各

汉诺塔系列问题: 汉诺塔II、汉诺塔III、汉诺塔IV、汉诺塔V、汉诺塔VI、汉诺塔VII

汉诺塔II:(hdu1207) /先说汉若塔I(经典汉若塔问题),有三塔,A塔从小到大从上至下放有N个盘子,如今要搬到目标C上, 规则小的必需放在大的上面,每次搬一个,求最小步数.这个问题简单,DP:a[n]=a[n-1]+1+a[n-1],先把 上面的n-1个放在B上,把最大的放在目标C上,再把N-1个放回到C上就可以. </pre><p></p>如今是汉若塔II,改为四个塔,開始方程想简单了,不是最优的.给出网上的一种最优解法例如以下:(1)将x(1<=x&l

HDU 1997 汉诺塔VII

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1997 Problem Description n个盘子的汉诺塔问题的最少移动次数是2^n-1,即在移动过程中会产生2^n个系列.由于发生错移产生的系列就增加了,这种错误是放错了柱子,并不会把大盘放到小盘上,即各柱子从下往上的大小仍保持如下关系 : n=m+p+qa1>a2>...>amb1>b2>...>bpc1>c2>...>cqai是A柱上的盘的盘号系

HDU 2064 汉诺塔III (递推)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2064 约19世纪末,在欧州的商店中出售一种智力玩具,在一块铜板上有三根杆,最左边的杆上自上而下.由小到大顺序串着由64个圆盘构成的塔.目的是将最左边杆上的盘全部移到右边的杆上,条件是一次只能移动一个盘,且不允许大盘放在小盘的上面. 现在我们改变游戏的玩法,不允许直接从最左(右)边移到最右(左)边(每次移动一定是移到中间杆或从中间移出),也不允许大盘放到下盘的上面. Daisy已经做过原来的汉诺塔问题