题意:有n个盘子,三根柱子的汉诺塔,每次只能将一个盘子移动到相邻的柱子上,求要几次操作才能将n个盘子从第一根柱子移动到第三根柱子上。
链接:http://acm.hdu.edu.cn/showproblem.php?pid=2064
思路:每次要将n-1个盘子从柱1->柱3,最大的盘子柱1->柱2,再讲n-1个盘子从柱3->柱1,在将最大的盘子从柱2->柱3,最后将n-1个盘子从柱1->柱3,因此需要的操作为f(n)=3*f(n-1)+2. f(0)=0
注意点:超出int范围,用long long
以下为AC代码:
Run ID | Submit Time | Judge Status | Pro.ID | Exe.Time | Exe.Memory | Code Len. | Language | Author |
12658273 | 2015-01-07 06:20:56 | Accepted | 2064 | 0MS | 1212K | 922 B | G++ | luminous11 |
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <deque>
#include <list>
#include <cctype>
#include <algorithm>
#include <climits>
#include <queue>
#include <stack>
#include <cmath>
#include <map>
#include <set>
#include <iomanip>
#include <cstdlib>
#include <ctime>
#define ll long long
#define ull unsigned long long
#define all(x) (x).begin(), (x).end()
#define clr(a, v) memset( a , v , sizeof(a) )
#define pb push_back
#define mp make_pair
#define read(f) freopen(f, "r", stdin)
#define write(f) freopen(f, "w", stdout)
using namespace std;
const double pi = acos(-1);
int main()
{
ios::sync_with_stdio( false );
ll num[40] = { 0, 2, 8, 26};
for ( int i = 4; i < 40; i ++ )
num[i] = 3 * num[i-1] + 2;
int n;
while ( cin >> n )
{
cout << num[n] << endl;
}
return 0;
}