若可以完成操作,则必然可以借助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角色对调 } } };