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