http://acm.hdu.edu.cn/showproblem.php?pid=4260
题意: 汉诺塔问题。输入一个由A B C组成的字符串,从左向右依此表示最小的盘子到最大的盘子分别在哪根柱子上。求将所有盘子移动到B柱上所需时间。
题解:采用处理普通汉诺塔问题思路,采用递归。先处理大的盘子,故从右向左处理字符串。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <map>
#include <set>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
//const double eps=1e-7;
//const double INF=1e50;
//const double pi=acos(-1);
#define N 5000
#define M 10000
char s[70];
long long hn(int m,char wh,char des,char by)
{
if (m>0)
{
if (s[m-1]==des) return hn(m-1,by,des,wh);
if (s[m-1]==wh)
{
long long ans=1;
ans=ans<<(m-1);
return ans+hn(m-1,wh,by,des);
}
return 0;
}
return 0;
}
int main()
{
freopen("a","r",stdin);
while (1)
{
gets(s);
if (s[0]=='X') break;
cout<<hn(strlen(s),'A','B','C')<<endl;
}
return 0;
}