问题
有三个立柱A、B、C。A柱上穿有大小不等的圆盘N个,较大的圆盘在下,较小的圆盘在上。要求把A柱上的圆盘全部移到C柱上,保持大盘在下、小盘在上的规律(可借助B柱)。每次移动只能把一个柱子最上面的圆盘移到另一个柱子的最上面。请输出移动过程。
解答
这是动态规划问题中的一种,用递归来实现较为简单方便。
对于“将moveSum个圆盘从from柱移动到to柱(借助by柱)”这个问题,我们可以通过以下三步实现:
1. 将from柱最上面的moveSum-1个圆盘移动到by柱(借助to柱)
2. 将from柱上剩下的那1个圆盘直接移动到to柱
3. 将by柱上的moveSum-1个圆盘移动到to柱(借助from柱)
图示
![这里写图片描述](https://img-blog.csdn.net/20170215113639890?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGhldXNQcm9tZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![这里写图片描述](https://img-blog.csdn.net/20170215113939660?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGhldXNQcm9tZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![这里写图片描述](https://img-blog.csdn.net/20170215113709484?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGhldXNQcm9tZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![这里写图片描述](https://img-blog.csdn.net/20170215113757908?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGhldXNQcm9tZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
代码
nclude <iostream>
using namespace std;
const int sumOfPlates = 4;
int sum[3] = { sumOfPlates, 0, 0 };
enum pillar{ A, B, C };
char name[3] = { 'A', 'B', 'C' };
void move(int moveSum, pillar from, pillar by, pillar to);
void main(){
move(sumOfPlates, A, B, C);
}
void move(int moveSum, pillar from, pillar by, pillar to){
if (moveSum == 0){
return;
}
else{
move(moveSum - 1, from, to, by);
cout << "move uppermost plate from " << name[from] << " to " << name[to] << endl;
move(moveSum - 1, by, from, to);
}
}