高分子溶液有哪些:汉诺塔问题的汉语详细解释

来源:百度文库 编辑:神马品牌网 时间:2024/04/30 04:22:01

汉诺塔问题

问题:
首先去掉原来的神话色彩:神庙、僧侣和世界末日,来到问题的数学本质。有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);
}
}

简单的说,通过的方法就是:若手中需要挪动的塔(由大到小顺序排列)为奇数个,就将第一个塔(最小的)移到目标格;若手中需要挪动的塔为偶数个,就将第一个塔移到剩余的那格 塔数多时分步挪动(先移两层,再至三层四层……) 最少步数为2的n次方再减1