Java三柱汉诺塔(梵塔)问题解决

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);
    }


以上就是我对这个题的总结啦!

猜你喜欢

转载自blog.csdn.net/sinat_15901371/article/details/78220115