汉诺塔解题思路
2020-07-02 21:52
22 查看
解题思路
汉诺塔塔问题符合数学统计归纳,千万别试图去理解n层移动问题(或者说去理解n层递归,人脑真不够用),理解3层汉诺塔问题就行。
总结起来如下:
递归的理解的要点主要在于放弃!放弃你对于理解和跟踪递归全程的企图,只理解递归两层之间的交接,以及递归终结的条件。
解题算法
- 如果A柱子只剩一个盘子,那么直接移动到C柱子即可
- 把 n-1 号盘子移动到缓冲区
- 把1号从起点移到终点
- 然后把缓冲区的n-1号盘子也移到终点
解题框架
/* 1.要从a到b 那c就是缓冲 move(n-1,from,to,buffer) 2.要从a到c 那b就是缓冲 move(1,from,buffer,to) 3.要从b到c 那a就是缓冲 move(n-1,buffer,from,to) */ //汉诺塔移动框架 void move(n,from,buffer,to){ if (n == 1) { removeTo(from,to); return; } move(n-1,from,to,buffer); move(1,from,buffer,to); move(n-1,buffer,from,to); } void removeTo(List<Integer> from, List<Integer> to) { to.add(from.remove(from.size() - 1)); }
Java代码
//汉诺塔问题解释https://www.zhihu.com/question/24385418 public void hanota(List<Integer> A, List<Integer> B, List<Integer> C) { remove(A.size(),A,B,C); } private void remove(int n, List<Integer> from, List<Integer> buffer, List<Integer> to) { //如果A柱子只剩一个盘子,那么直接移动到C柱子即可 if (n == 1) { removeTo(from,to); return; } //1.把 n-1 号盘子移动到缓冲区 //把A柱子上面的n-1个盘子,借助辅助柱子C,放到柱子B上 remove(n - 1, from, to, buffer); //2.把1号从起点移到终点 //此时A柱子剩下那个盘子是n个盘子中最大的那个,把他移动到C柱子上 remove(1, from,buffer,to); //3.然后把缓冲区的n-1号盘子也移到终点 //最后把刚才放在B柱子上的n-1个盘子,借助柱子A辅助,放到柱子C上 remove(n - 1, buffer, from, to); } private void removeTo(List<Integer> from, List<Integer> to) { to.add(from.remove(from.size() - 1)); }
相关文章推荐
- LeetCode 79. Word Search解题思路。
- 黑客榜中榜 三期 解题思路
- dp方法论——由矩阵相乘问题学习dp解题思路
- 2018年高教社杯全国大学生数学建模竞赛B题解题思路
- leetCode 70.Climbing Stairs (爬楼梯) 解题思路和方法
- hdu1205 吃糖果解题思路
- SSD6 exercise1 解题思路
- leetCode 28.Implement strStr() (实现字符串匹配函数) 解题思路和方法
- leetCode 33.Search in Rotated Sorted Array(排序旋转数组的查找) 解题思路和方法
- leetCode 53.Maximum Subarray (子数组的最大和) 解题思路方法
- "巴卡斯杯" 中国大学生程序设计竞赛 - 女生专场(重现)解题思路
- leetCode 82.Remove Duplicates from Sorted List II (删除排序链表的重复II) 解题思路和方法
- [LeetCode] Merge Sorted Array 解题思路
- leetCode 111.Minimum Depth of Binary Tree(二叉树最小深度) 解题思路和方法
- leetCode 64.Minimum Path Sum (最短路) 解题思路和方法
- hdu 2147解题思路
- Poj2430:Lazy Cows 解题思路&代码
- C语言经典题目及解题思路
- 西普ctf解题思路——《貌似有点难》
- 迭代器_HashMap分拣思路与面向对象组合解题JAVA_119-121