目录
题目链接
解题思路
解题代码
题目链接
LeetCode - 面试题 08.06. 汉诺塔问题
解题思路
假设 n = 1,只有一个盘子,很简单,直接把它从 A 中拿出来,移到 C 上;
如果 n = 2 呢?这时候我们就要借助 B 了,因为小盘子必须时刻都在大盘子上面
如果 n > 2 呢?思路和上面是一样的,我们把 n 个盘子也看成两个部分,一部分有 1 个盘子,另一部分有 n - 1 个盘子。
n>2 时的递归流程图解:
解题代码
class Solution {
public:
void hanota(vector<int>& A, vector<int>& B, vector<int>& C) {
int n = A.size();
move(n, A, B, C);
}
void move(int n, vector<int>& A, vector<int>& B, vector<int>& C) {
if (n == 1) {
C.push_back(A.back());
A.pop_back();
return;
}
move(n - 1, A, C, B); // 将A上面n-1个通过C移到B
C.push_back(A.back()); // 将A最后一个移到C
A.pop_back(); // 这时,A空了
move(n - 1, B, A, C); // 将B上面n-1个通过空的A移到C
}
};
int main() {
vector<int> A = { 3, 2, 1 }, B = {}, C = {};
Solution sol;
sol.hanota(A, B, C);
// 打印结果
cout << "C tower contains: ";
for (int num : C) {
cout << num << " ";
}
cout << endl;
return 0;
}