[演算法練習及思路-程式設計師面試金典(Java解法)]No46.漢諾塔問題

葉落雨飄發表於2020-11-24

題號:no46

題目名:漢諾塔問題

原題URL:https://leetcode-cn.com/problems/hanota-lcci/

題目描述

在經典漢諾塔問題中,有 3 根柱子及 N 個不同大小的穿孔圓盤,盤子可以滑入任意一根柱子。一開始,所有盤子自上而下按升序依次套在第一根柱子上(即每一個盤子只能放在更大的盤子上面)。移動圓盤時受到以下限制:
(1) 每次只能移動一個盤子;
(2) 盤子只能從柱子頂端滑出移到下一根柱子;
(3) 盤子只能疊在比它大的盤子上。

請編寫程式,用棧將所有盤子從第一根柱子移到最後一根柱子。

你需要原地修改棧。

示例

示例 1:

 輸入:A = [2, 1, 0], B = [], C = []
 輸出:C = [2, 1, 0]

示例 2:

 輸入:A = [1, 0], B = [], C = []
 輸出:C = [1, 0]

限制

  • A中盤子的數目不大於14個。

思路

1.遞迴,遞迴思維如下

漢諾塔移動步驟
    1.將A的頂部那塊移動到B
    2.將A頂部那塊移動到C
    3.將B頂部那塊移動到C

解題程式碼

public class Solution {
    public void hanota(List<Integer> A, List<Integer> B, List<Integer> C) {
        /*  漢諾塔移動步驟
            1.將A的頂部那塊移動到B
            2.將A頂部那塊移動到C
            3.將B頂部那塊移動到C
         */
        hanota(A,B,C,A.size());
    }

    private void hanota(List<Integer> a, List<Integer> b, List<Integer> c, int size) {
        if(a.size()==1) {
            c.add(a.remove(0));
            return;
        }
        //將A的頂部那塊移動到B
        hanota(a,c,b,size-1);
        //將A的頂部那塊移動到C
        hanota(a,b,c,1);
        //將B頂部那塊移動到C
        hanota(b,a,c,size-1);
    }
}

相關文章