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一遍就把答案算出来了。。。好像没有坑
题意:汉诺塔问题,给定一串只有(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; }
相关文章推荐
- 链式栈 (实现进制转换)
- TexturePacker 自定义模板
- 2.1 选区的基本操作
- 二叉树思想小结
- 算法题:压缩任意字符串
- Python进阶之匿名函数
- Design Pattern Explained 读书笔记四——Strategy
- PHP中global关键字和$GLOBALS用法
- Problem<c>( Link-cut tree )
- extjs类继承图之组件(1)
- Android Fragment 真正的完全解析(下)
- css页面布局基础盒模型
- 机试算法讲解:第32题 并查集是个好东西
- 机试算法讲解:第31题 大整数的M进制转N进制
- 微软纳德拉:柯塔娜是市场竞争游戏规则的变革者
- 链式队列
- C语言播放MP3音乐
- JUC系列一:线程安全性
- CSS的布局
- 机试算法讲解:第30题 大整数的阶乘