若可以完成操作,则必然可以借助mid把所有前n-1个正确放置到mid上,然后把第n个放到right.
这时,mid上有n-1个,left为0,right上为n,可以看成n-1的子问题,只是这时mid为原来的left,
left为原来的mid。
所以可以分为两步:
第一步为借助mid把n-1全放到mid上,然后n直接放到right。
第二步,把mid和left处理方法对调或是swap(mid,left)角色,进行n-1阶的处理即可。
#include <vector>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param n int整型
* @return string字符串vector
*/
vector<string> getSolution(int n) {
process(n);
return res;
}
vector<string> res;
string tab[4]={"","left","mid","right"};
void process(int n, int left=1,int mid=2,int right=3) {
if (n==1) {
string tmp="move from " + tab[left] + " to " + tab[right];
res.push_back(tmp);
}
else {
process(n-1, left,right,mid);//先把上面n-1放到mid上
string tmp="move from " + tab[left] + " to " + tab[right]; //最后n直接放到目标right上
res.push_back(tmp);
process(n-1, mid, left, right); // 只剩下n-1个了,只是现在的left和mid角色对调
}
}
};

京公网安备 11010502036488号