zoukankan      html  css  js  c++  java
  • 2018/12/21 HDU-2077 汉诺塔IV(递归)

    汉诺塔IV
    > > Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K
    (Java/Others) Total Submission(s): 10905 Accepted Submission(s):
    7541

    Problem Description
    还记得汉诺塔III吗?他的规则是这样的:不允许直接从最左(右)边移到最右(左)边(每次移动一定是移到中间杆或从中间移出),也不允许大盘放到小盘的上面。xhd在想如果我们允许最大的盘子放到最上面会怎么样呢?(只允许最大的放在最上面)当然最后需要的结果是盘子从小到大排在最右边。

    Input 输入数据的第一行是一个数据T,表示有T组数据。 每组数据有一个正整数n(1 <= n <= 20),表示有n个盘子。

    Output 对于每组输入数据,最少需要的摆放次数。

    Sample Input 2 1 10

    Sample Output 2 19684

    解题思路:
    因为每次只能够移一格,最大的可以放在最上面,所以:
    先把前n-1个从a移动到b,第n个移动两次到c
    再移动n-1个到c。
    设从a→c移动次数为f(n)
    分类:
    ①h(n)=f(n-1)+2
    //第n个移动的情况,前n-1个只需移动一大次,加上最大的移动两次。(最好画图)
    ②f(n)=3f(n-1)+2
    //剩下n-1个移动的情况:大的不能在小的上方,所以n-2个需要从a到c(a到c移动两次),c到a,a再到c。所以是三次大移动。

    源代码地址.

    #include<iostream>
    using namespace std;
    int main()
    {
    	long long int a[25];
    	a[0] = 2;
    	for (int i=1;i<20;i++)
    	{
    		a[i] = a[i - 1] * 3 + 2;
    	}
    	int n, m;///m为组数,n为需要移动的个数
    	cin >> m;
    	for (int i = 0; i < m; i++)
    	{
    		long long x = 0;
    		cin >> n;
    		switch (n)
    		{
    		case 1:x = 2; break;
    		case 2:x = 4; break;
    		default:x = a[n - 2] + 2; break;
    		}
    		cout << x << endl;
    	}
        return 0;
    }
    

    各参数

  • 相关阅读:
    推荐一款idea 翻译插件 ECTranslation
    idea 执行maven 命令
    Future Clalback使用案例
    newCachedThreadPool使用案例
    线程池 原理学习笔记
    使用curator框架简单操作zookeeper 学习笔记
    mongo aggregate 用法记录
    ReentrantLock 学习笔记
    VUE:过渡&动画
    VUE:生命周期
  • 原文地址:https://www.cnblogs.com/gidear/p/10433317.html
Copyright © 2011-2022 走看看