接着讨论之前的问题汉诺塔问题–递归版,也可以用迭代实现,考虑用三个栈代表三根柱子,出栈入栈代表了碟子的离开柱子和到达柱子的过程。
考虑碟子移动的过程:
- 由于要最小化移动次数,因此不会出现两次相临的移动都发生在同一对柱子间。因此当左中柱子间发生碟子移动时,下一次移动必发生在中间和右边;
- 对于一对柱子(左中,中右),要判断哪个出栈哪个入栈很简单,若其中一个为空,则此栈将另一个出栈的元素入栈。若都不为空,则栈顶元素小的出栈,入栈到栈顶元素大的那边。
可以用一个标志量记录哪对柱子该发生移动。
#include<iostream>
#include<string>
#include<stack>
#include<vector>
using std::string;
using std::