汉诺塔的实现 c++

汉诺塔问题:假设有从左到右有三个名字分别为x,y,z的塔座, 在塔座x上有n各直径大小各不相同,按照直径从小到大编号为1,2,。。。n的圆盘。现在要求将x轴上的n个圆盘移动到塔座z上,并且按同样的顺序叠排,圆盘移动规则如下

  1. 每次只能移动一个圆盘
  2. 圆盘可以插在任何一个塔座上
  3. 任何时刻小盘都必须在大盘之上

思路如下:n=1的时候,问题最简单,直接把圆盘移动到z就行。当n>1的时候,就需要用y作为辅助塔座,设法将压在n上面的n-1

的圆盘从x移动到y上,则可以把圆盘n移到z上面,再通过上面的办法把y上的圆盘移动到z上面。如何将n-1个圆盘从一个塔座移动到另外一个塔座是一个和原问题一样的问题,只是规模不相同。

这里用vector来保存每一个塔座上的圆盘,当移动圆盘时,一个塔座的vector弹出最后面的元素, 一个塔座将前面弹出的圆盘添加到子集的vector中

 1 /*
 2     author: LaiXingYu
 3       date:2018/5/10
 4 */
 5 /*
 6     para: @n, number of plates, @x, @y, @z, move plates from x to z, via y;
 7 */
 8 void hanoi(int n, vector<int>& x, vector<int>& y, vector<int>& z){
 9     if(n == 1){
10         z.push_back(x.back());
11         x.pop_back();
12         return;
13     }else{
14         hanoi(n-1, x, z, y);     //把n-1个盘子从x经过z移动到y
15         z.push_back(x.back());   //把x剩下的盘子移动到z上
16         x.pop_back();
17         hanoi(n-1, y, x, z);     //把n-1个盘子从y经过x移动到z
18     }
19 }

猜你喜欢

转载自www.cnblogs.com/mr-stn/p/9022302.html