问题:
首先去掉原来的神话色彩:神庙、僧侣和世界末日,来到问题的数学本质。有A、B、C三根柱子。A上堆放了n个盘子,每个盘子都比它下面的盘子小一些。现在要把盘子全部搬到C上去,条件是每次只能搬动一个盘子,而且任何时候都不能放在比它小的盘子上面(显然,必须用到B作为中转)。怎么搬动这些盘子呢?
解决:
玩一下这个游戏,很快就会发现,想把n个盘子搬到C,必须先把上面的n-1个盘子搬到B,然后把第n个盘子搬到C,最后再把n-1个盘子搬过来。整个过程是这样的:
1,把上面的n-1个盘子从A搬到B,以C作为中转;
2,把第n个盘子从A搬到C;
3,把n-1个盘子从B搬到C,以A作为中转。
也就是说,要解决n个盘子的问题,先要解决n-1个盘子的问题。而这个问题与前一个是类似的,可以用相同的办法解决。最终,我们会来到只有一个盘子的情况,很简单,直接把盘子从A搬到C即可。通过以上分析可以写出:
void hanoi (int n, char src, char mid, char dst)
{
if (n == 1)
cout << " move " << src << " to " << dst << endl;
else
{
hanoi (n-1, src, dst, mid);
cout << "move " << src << " to " << dst << endl;
hanoi (n-1, mid, src, dst);
}
}