import java.util.*;
public class test
{
public static void main(String[] args)
{
int height = 3; //表示塔高
LinkedList<Integer> from = new LinkedList<Integer>();
LinkedList<Integer> to = new LinkedList<Integer>();
LinkedList<Integer> helper = new LinkedList<Integer>();
for(int i = height; i >= 1; i--)
{
from.push(i);
}
Solution.hanoiTower(height, from, to, helper);
System.out.println("over" + to);
}
}
class Solution
{
public static void hanoiTower(int height, LinkedList<Integer> from, LinkedList<Integer> to, LinkedList<Integer> helper)
{
if(height == 1)
{
move(from,to);
return;
}
hanoiTower(height-1,from,helper,to);
move(from,to);
hanoiTower(height-1,helper,to,from);
}
private static void move(LinkedList<Integer> from, LinkedList<Integer> to)
{
System.out.println("move form " + from + " to " + to);
to.push(from.pop());
}
}
这个问题的解法和思路网上已经有很多的了。
我在参考了知乎用户 @Shelley Lee 的答案之后完成了本题的解答。记录下思路。
汉诺塔问题的普遍思路是利用递归。
以高为3的塔为例,我们的解题步骤为:
①想办法将砖1和砖2移动到第二个柱子上
②将最底层的砖3移动到第三个柱子上
③将砖1和砖2移动到砖3上
显然,怎么①和③是怎么完成的与②是怎么完成的并没有关系。
那么,高为4的塔要怎么办呢?
①想办法将砖1和砖2和砖3移动到第二个柱子上
②将最底层的砖4移动到第三个柱子上
③将砖1和砖2和砖3移动到砖4上
所以以此类推是不是就可以解决高5、6、7......N的汉诺塔问题了。
这时候就有另一个问题了。
要求将n个砖从柱一移到柱三,在处理子问题 移动n-1个砖时,要将n-1个砖从柱一移动到柱二。
可以看出,利用递归的时候,每次的起点柱和目标柱并不是相同的。
规律为:
在执行起始到第一阶段时,n-1块砖的目标柱为n块砖的中间柱,而n块砖的目标柱变成了n-1的目标柱。
n | from | to | helper |
n-1 | form | helper | to |
在执行第二到第三阶段时,n块砖的中间变成了n-1的起点柱,n-1块砖的起点柱为n块砖的中间柱。
n | from | to | helper |
n-1 | helper | to | from |
所以就得到了递归啦:
hanoiTower(height-1,from,helper,to);
move(from,to);
hanoiTower(height-1,helper,to,from);
当然了,当剩余的高度为1的时候就不需要递归了,直接把那一块砖搬过去就好了。
就得到了完整的递归函数:
public static void hanoiTower(int height, LinkedList<Integer> from, LinkedList<Integer> to, LinkedList<Integer> helper)
{
if(height == 1)
{
move(from,to);
return;
}
hanoiTower(height-1,from,helper,to);
move(from,to);
hanoiTower(height-1,helper,to,from);
}
以上就是我对这个题的总结啦!