1. 程式人生 > 其它 >漢諾塔問題Java版【遞迴求解】(力扣)

漢諾塔問題Java版【遞迴求解】(力扣)

技術標籤:LeetCodejava遞迴演算法leetcode漢諾塔問題

漢諾塔問題

在經典漢諾塔問題中,有 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個。

題意:就是經典的漢諾塔問題,將盤子從A移動到C。

思路:看本人的這篇文章,裡面詳細解釋了:漢諾塔問題(遞迴寫法)

程式碼:

class Solution {
    public void hanota(List<Integer> A, List<Integer> B, List<Integer> C) {
        int n = A.size(); // 總共n個盤子
        move(n,A,B,C);
    }

    private
void move(int n, List<Integer> a, List<Integer> b, List<Integer> c) { if(n==1){ c.add(a.remove(a.size()-1)); return; } // 最初 a是滿的,所有盤子都在a上,b是空的,c是空的 //三步走戰略: //第一步:把a上面的n-1個盤子從a藉助c移動到b上 //第二步:把a上面的最下面的那個盤子從a移動到c //第三步:把b上面的n-1個盤子藉助a移動到c上
move(n-1,a,c,b); //將a上面n-1個盤子通過c移動到b c.add(a.remove(a.size()-1)); // 將a最下面的那個盤子移動到c move(n-1,b,a,c); // 將n-1個盤子通過a從a移動到c } }

完整程式碼(含測試樣例):

package com.Keafmd.day0110;

import java.util.ArrayList;
import java.util.List;

/**
 * Keafmd
 *
 * @ClassName: Hanota
 * @Description: 漢諾塔問題 https://leetcode-cn.com/problems/hanota-lcci/
 * @author: 牛哄哄的柯南
 * @date: 2021-01-10 19:15
 */
public class Hanota {
    public static void main(String[] args) {
        List<Integer> A = new ArrayList<Integer>();
        List<Integer> B = new ArrayList<Integer>();
        List<Integer> C = new ArrayList<Integer>();
        A.add(2);
        A.add(1);
        A.add(0);

        Solution solution = new Solution();
        solution.hanota(A,B,C);

        for (int i = 0; i < C.size(); i++) {
            System.out.println(C.get(i));
        }

    }
}

class Solution {
    public void hanota(List<Integer> A, List<Integer> B, List<Integer> C) {
        int n = A.size(); // 總共n個盤子
        move(n,A,B,C);
    }

    private void move(int n, List<Integer> a, List<Integer> b, List<Integer> c) {
        if(n==1){
            c.add(a.remove(a.size()-1));
            return;
        }

        // 最初 a是滿的,所有盤子都在a上,b是空的,c是空的

        //三步走戰略:
        //第一步:把a上面的n-1個盤子從a藉助c移動到b上
        //第二步:把a上面的最下面的那個盤子從a移動到c
        //第三步:把b上面的n-1個盤子藉助a移動到c上

        move(n-1,a,c,b); //將a上面n-1個盤子通過c移動到b
        c.add(a.remove(a.size()-1)); // 將a最下面的那個盤子移動到c
        move(n-1,b,a,c); // 將n-1個盤子通過a從a移動到c

    }
}

執行結果:

2
1
0

Process finished with exit code 0

看完如果對你有幫助,感謝點贊支援!
如果你是電腦端,看到右下角的 “一鍵三連” 了嗎,沒錯點它[哈哈]

在這裡插入圖片描述
加油!

共同努力!

Keafmd