leetcode:面试题 08.06. 汉诺塔问题
题目链接
面试题 08.06. 汉诺塔问题
题目描述
题目解析
- 当只有一个盘子时:直接从A柱放到C柱即可。
- 当有两个盘子时:将A柱第一个盘子先放到B柱,再将A柱第二个盘子放到C柱,最后将B柱上的盘子放到C柱子。
- 当有3个盘子时:先A柱上面两个盘子借助C柱放到B柱子,再将A柱上最后一个盘子放入C柱,最后将B柱子上的盘子借助A柱放入C柱。
- 当有n个盘子时:先A柱上n-1个盘子借助C柱放到B柱子,再将A柱上最后一个盘子放入C柱,最后将B柱子上的盘子借助A柱放入C柱。
解法1:纯递归
// 方法一:纯递归
// my_hanota:将A柱子中最上面的n个盘子经由B移动到C中;也就是将A中后n个元素经由B移动到C中。
void my_hanota(int n, vector<int>& A, vector<int>& B, vector<int>& C) {if (n == 1){C.push_back(A.back()); A.pop_back();return;}my_hanota(n - 1, A, C, B);C.push_back(A.back()); A.pop_back();my_hanota(n - 1, B, A, C);
}
void hanota(vector<int>& A, vector<int>& B, vector<int>& C) {int n = A.size();my_hanota(n, A, B, C);
}
解法2:体会参数的递归过程
// 方法二:强迫使用一个参数,简单换一种递归思考方式
// m参数用于体验递归过程
// 用m表示最大的盘子在数组中的位置
void my_hanota(int n, int m, vector<int>& A, vector<int>& B, vector<int>& C)
{if (n == 1){C[m] = A[m];return;}my_hanota(n - 1, m + 1, A, C, B);//将A中后n-1个元素经由C放入BC[m] = A[m];my_hanota(n - 1, m + 1, B, A, C);
}
void hanota(vector<int>& A, vector<int>& B, vector<int>& C) {int n = A.size();B.resize(n);C.resize(n);int m = 0;my_hanota(n, 0, A, B, C);
}