1. 程式人生 > >ACM_漢諾塔問題(水)

ACM_漢諾塔問題(水)

for 思路 names include 推導 span return bits tar

Problem Description:

最近小G迷上了漢諾塔,他發現n個盤子的漢諾塔問題的最少移動次數是2^n-1,即在移動過程中會產生2^n個系列。由於發生錯移產生的系列就增加了,這種錯誤是放錯了柱子,並不會把大盤放到小盤上,即各柱子從下往上的大小仍保持如下關系 :
n=m+p+q 
a1>a2>...>am
b1>b2>...>bp
c1>c2>...>cq
小G希望聰明的你能告訴他所有會產生的系列總數。

Input:

輸入一個N,N<30

Output:

對於每組數據,輸出移動過程中所有會產生的系列總數

Sample Input:

1
3

Sample Output:

3
27
解題思路:這道題跟 杭電hdu1996漢諾塔VI 幾乎一樣。在正確的擺放規則下,問題求解其實就是把n個盤子分開擺在3個塔上出現的所有可能情況數。簡單地推導一下公式:3n(n<30).
AC代碼:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 int n;
 5 int main()
 6 {
 7     LL a[35]={1};
 8     for(int i=1;i<35;i++)
 9         a[i]=a[i-1
]*3; 10 while(cin>>n){ 11 cout<<a[n]<<endl; 12 } 13 return 0; 14 }

ACM_漢諾塔問題(水)