首页 > 代码库 > HDU 2064 汉诺塔III (递推)
HDU 2064 汉诺塔III (递推)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2064
约19世纪末,在欧州的商店中出售一种智力玩具,在一块铜板上有三根杆,最左边的杆上自上而下、由小到大顺序串着由64个圆盘构成的塔。目的是将最左边杆上的盘全部移到右边的杆上,条件是一次只能移动一个盘,且不允许大盘放在小盘的上面。
现在我们改变游戏的玩法,不允许直接从最左(右)边移到最右(左)边(每次移动一定是移到中间杆或从中间移出),也不允许大盘放到下盘的上面。
Daisy已经做过原来的汉诺塔问题和汉诺塔II,但碰到这个问题时,她想了很久都不能解决,现在请你帮助她。现在有N个圆盘,她至少多少次移动才能把这些圆盘从最左边移到最右边?
现在我们改变游戏的玩法,不允许直接从最左(右)边移到最右(左)边(每次移动一定是移到中间杆或从中间移出),也不允许大盘放到下盘的上面。
Daisy已经做过原来的汉诺塔问题和汉诺塔II,但碰到这个问题时,她想了很久都不能解决,现在请你帮助她。现在有N个圆盘,她至少多少次移动才能把这些圆盘从最左边移到最右边?
Input包含多组数据,每次输入一个N值(1<=N=35)。Output对于每组数据,输出移动最小的次数。Sample Input
1312
Sample Output
226531440
题解:
可知,要想把第n个盘从左(1)移到3,需要想把前n-1个从左(1)移动右(3),再从右(3)移到左(1),最后再从左(1)移到右(3)。
而第n个盘要从左(1)到中(2)再右(3)经历2步。
所以,f(n)=3*f(n-1)+1;经数学计算最终可得到f(n)=3^n-1;
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 10000000000000000018 #define MOD 100000000719 #define pi acos(-1.0)20 #define ei exp(1)21 #define PI 3.14159265358979323846222 #define INF 0x3f3f3f3f3f23 #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 std::ios::sync_with_stdio(false);37 ll dp[36]={0,2};38 for(int i=2;i<36;i++){39 dp[i]=3*dp[i-1]+2;40 }41 int n;42 while(cin>>n){43 cout<<dp[n]<<endl;//dp[n]=3^n-1;44 }45 return 0;46 }
HDU 2064 汉诺塔III (递推)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。