2014-03-18 05:28

题目:你肯定听过汉诺威塔的故事:三个柱子和N个从小到大的盘子。既然每次你只能移动放在顶上的盘子,这不就是栈操作吗?所以,请用三个栈来模拟N级汉诺威塔的玩法。放心,N不会很大的。

解法:递归着玩儿吧,还挺容易写的。要是迭代,我估计够呛。

代码:

 // 3.4 Implement Hanoi Tower with three stacks.
#include <cstdio>
#include <stack>
using namespace std; class Solution {
public:
void initHanoiTower(int n) {
int i; clearHanoiTower(); for (i = n; i >= ; --i) {
s[].push(i);
}
} void moveHanoiTower(int n, int from, int to) {
if (from == to) {
return;
} if ((int)s[from].size() < n) {
return;
} if (n == ) {
s[to].push(s[from].top());
s[from].pop();
return;
} int i;
for (i = ; i < ; ++i) {
b[i] = false;
}
b[from] = true;
b[to] = true;
int other;
for (i = ; i < ; ++i) {
if (!b[i]) {
other = i;
break;
}
} moveHanoiTower(n - , from, other);
moveHanoiTower(, from, to);
moveHanoiTower(n - , other, to);
} void clearHanoiTower() {
int i; for (i = ; i < ; ++i) {
while (!s[i].empty()) {
s[i].pop();
}
}
} void printHanoiTower() {
stack<int> ss[];
int i; for (i = ; i < ; ++i) {
ss[i] = s[i];
printf("Tower %d:", i + );
while (!ss[i].empty()) {
printf(" %d", ss[i].top());
ss[i].pop();
}
printf("\n");
}
}
private:
stack<int> s[];
int b[];
}; int main()
{
int n;
Solution sol; while (scanf("%d", &n) == && n > ) {
sol.initHanoiTower(n); printf("At the beginning:\n");
sol.printHanoiTower();
printf("\n"); sol.moveHanoiTower(n, , ); printf("At the end:\n");
sol.printHanoiTower();
printf("\n");
} return ;
}

最新文章

  1. nginx配置反向代理解决前后端分离跨域问题
  2. 原生JS实战:分享一个首页进度加载动画!
  3. 同一台机子上用多个git 账号
  4. PageRank算法简介及Map-Reduce实现
  5. linux下cmake编译安装、配置和卸载mysql
  6. Oracle 函数中动态执行语句
  7. 【转】MySQL USE NAMES &#39;UTF8&#39;
  8. ubuntu完美搭建git服务器【转】
  9. Hacker(20)----手动修复Windows系统漏洞
  10. HDU 1548 A strange lift(dij+邻接矩阵)
  11. Lua学习系列(四)
  12. Cocoapods在OS X Yosemite上升级时 报错的解决方法
  13. js 深拷贝和浅拷贝
  14. Gradle 1.12用户指南翻译——第二十一章. Gradle 插件
  15. Android 带你玩转实现游戏2048 其实2048只是个普通的控件
  16. 让织梦内容页arclist标签的当前文章标题加亮显示
  17. Hive数据导入导出
  18. HTML语义化
  19. iOS 图文混排
  20. MVC -18.缓存(2)

热门文章

  1. BZOJ 2735: 世博会 主席树+切比雪夫距离转曼哈顿距离
  2. 几乎零配置产生Nuget包的库:White Tie
  3. c++ 读入和写入文件
  4. 安卓装tensorflow
  5. 自己编写shave函数
  6. [USACO07FEB]银牛派对Silver Cow Party---最短路模板题
  7. matlab时间测试
  8. machine learning trends from nips14
  9. vim 个性化设置和操作
  10. 汇编:输出寄存器AX中的内容(子程序)