您的位置:首页 > 其它

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

2015-07-31 01:09 351 查看
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;
	}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: