题目:
假设有3个柱子和一组不同大小的圆盘,柱子从圆盘的中心穿过。开始时,所有圆盘叠放在左侧第一个柱子上,目标是将所有的圆盘从第一个柱子移动到第三个柱子,同时遵守以下规则:
- 除了被移动时,所有圆盘都必须放在柱子上。
- 一次只能移动一个圆盘。
- 圆盘不能放置在比它小的圆盘上面。
递归解法:
递归地将 n-1 个圆盘从第一个柱子移动到第二个柱子,而使用第三个柱子作为临时挂钩,那么最大的圆盘将独自放在第一个柱子上。然后就可以一次性把最大圆盘从第一个柱子移动到第三个柱子。接下来,可以(递归地)将 n-1 个圆盘从第二个柱子移动到第三个柱子,这次使用第一个柱子作为临时柱子。
void moveDisks(int n, string source, string dest, string temp)
{
if (n > 0)
{
//将n-1圆盘从源柱子移动到临时柱子
//使用目标柱子作为临时柱子
moveDisks(n - 1, source, temp, dest);
//将圆盘从源柱子移动到目标柱子
cout << "Move a disk from " << source << " to " << dest << endl;
//将n-1圆盘从临时柱子移动到目标柱子
//使用源柱子作为临时柱子
moveDisks(n - 1, temp, dest, source);
}
}
参考链接