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

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; else
	if (all!=2&&judge!=2) 		all=2; else
	if (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;
	}


你可能感兴趣的:(F - Towers of Hanoi Strike Back-汉诺塔问题)