HDU 4260 The End of The World(汉罗塔)

  1. /* 很经典的规律题,应该要给以后
  2. 汉罗塔问题,要用到一个公式:假设N个盘子都在A上,那么搬到B上则需要2^N - 1次。 
  3. dfs(B, pos)的作用是:将前面pos个盘子全部搬到B上所需要多少次。 
  4. 这样,dfs(B, pos) = dfs(C, pos - 1) + pow(2.0, pos - 1) - 1 + 1; 
  5. 即,先将pos - 1个盘子都放在C处,然后将最后剩余一个盘子放在B上,再将C上面的盘子都放回B处。 
  6. dfs中的B\C具体需要转换 
  7. */  
  8.   
  9. #include <cstdio>   
  10. #include <cstring>   
  11. #include <cmath>   
  12. const int nMax = 65;  
  13. char s[nMax];  
  14.   
  15. __int64 dfs(char B, int pos)  
  16. {  
  17.     if(pos == 0)  
  18.     {  
  19.         if(s[0] == B) return 0;  
  20.         else return 1;  
  21.     }  
  22.     else  
  23.     {  
  24.         if(s[pos] == B) return dfs(B, pos - 1);  
  25.         else  
  26.         {  
  27.             return (__int64)pow(2.0, pos) + dfs(3*'B' - B - s[pos], pos - 1);  
  28.         }  
  29.     }  
  30. }  
  31.   
  32. int main()  
  33. {  
  34.     while(gets(s))  
  35.     {  
  36.         if(s[0] == 'X'break;  
  37.         int len = strlen(s);  
  38.         __int64 ans = dfs('B', len - 1);  
  39.         printf("%I64d\n", ans);  
  40.     }  
  41.     return 0;  
  42. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值