题解 | #汉诺塔问题#
汉诺塔问题
https://www.nowcoder.com/practice/7d6cab7d435048c4b05251bf44e9f185
/* 代码写的有点乱,核心思路就是 记把n个盘子从left->right的步骤为Dp_left_right[n] 首先需要把头上n-1个盘子right->mid,然后把第n个盘子从left->right 最后再把n-1个盘子mid->right. 则有: Dp_left_right[n] = Dp_left_mid[n-1] + left->right + Dp_mid_right[n-1] 需要注意的是,不管这n个盘子怎么移动,本质上都是从一个from到to, 然后有一个可以操作的space,我们只需要改变这些目标的名字就可以了 假设有一个更换名字的函数f,表达试就变为: Dp_left_right[n] = f1(Dp_left_right[n-1]) + left->right + f2(Dp_left_right[n-1]) */ class Solution { private: int num; void transform(vector<vector<string>> &dp, string from, string to, string space){ for(int i=0;i<dp.size();++i){ for(int j=0;j<dp[0].size();++j){ if(dp[i][j]=="left"){dp[i][j]=from;continue;} if(dp[i][j]=="right"){dp[i][j]=to;continue;} if(dp[i][j]=="mid"){dp[i][j]=space;continue;} } } } void move(int id, vector<vector<string>> &dp){ if(id>=num){ return; } vector<vector<string>> dp_from_space = dp; transform(dp_from_space,"left","mid","right"); vector<vector<string>> dp_space_to = dp; transform(dp_space_to,"mid","right","left"); dp_from_space.push_back({"left","right"}); for(auto vec:dp_space_to)dp_from_space.push_back(vec); dp = dp_from_space; move(id+1,dp); } public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param n int整型 * @return string字符串vector */ vector<string> getSolution(int n) { // write code here num = n; vector<vector<string>> dp={{"left","right"}}; move(1,dp); vector<string> ans; for(auto vec:dp){ string word = "move from "+ vec[0] + " to " + vec[1]; ans.push_back(word); } return ans; } };