汉诺塔问题:假设有从左到右有三个名字分别为x,y,z的塔座, 在塔座x上有n各直径大小各不相同,按照直径从小到大编号为1,2,。。。n的圆盘。现在要求将x轴上的n个圆盘移动到塔座z上,并且按同样的顺序叠排,圆盘移动规则如下
- 每次只能移动一个圆盘
- 圆盘可以插在任何一个塔座上
- 任何时刻小盘都必须在大盘之上
思路如下: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 }