F - Towers of Hanoi Strike Back-汉诺塔问题

来源:互联网 发布:赛鱼机源码 编辑:程序博客网 时间:2024/06/06 02:00

http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=61980

题意:汉诺塔问题,给定一串只有(A, B, C)的字符串(A代表在第一根柱子,B代表在第二根柱子,C代表在第三根柱子),从前往后代表盘子的大小,第 i 个字母代表di i 个盘子在某个柱子上。问移动给定字母状态的盘子最少需要多少步。


建议先做一下 Pro.ID  1995 汉诺塔V

http://acm.hdu.edu.cn/showproblem.php?pid=1995   

这个是普通的汉诺塔,最优的步数是2^n-1,只不过问的第i个盘子移动的次数。 做了这个就知道第i个盘子移动步数是2^(i-1)

因为一开始全部都在A  记state=A   从最后一个开始考虑  如果 最后一个目标是B  则 总步数+=2^(n-1)  然后state=C  (做了上面那题就知道为什么了,可以去搜题解)

for一遍就把答案算出来了。。。好像没有坑



#include <cstdio>#include <cmath>#include <cstring>#include <string>#include <queue>#include <algorithm>#include <iostream>using namespace std; int tm[55]; void  change_all_state(int& all,int judge){if (all!=3&&judge!=3) all=3; elseif (all!=2&&judge!=2) all=2; elseif (all!=1&&judge!=1) all=1; } int main() { int n;cin>>n;getchar();int i;char cha;for (i=1;i<=n;i++){scanf("%c",&cha);tm[i]=cha-'A'+1;}int all=1;__int64 sum=0;for (i=n;i>=1;i--){if (tm[i]!=all){sum+=(__int64)pow(2.0,i-1);change_all_state(all,tm[i]);} }printf("%I64d\n",sum);  return 0;}


0 0