簡體   English   中英

河內之塔:找到第n個配置

[英]Towers of Hanoi: Finding the n-th configuration

考慮到光盤數量和移動數量,我想在河內塔問題的解決方案中找到第n個配置。

以下代碼使用尾部遞歸找到第n個移動:


  public static String N_th_Move(int k_discs, int move){
        return HanoiRec(k_discs, move, "A", "B", "C");
    }

    private static String HanoiRec(int k_discs, int move, String rod_a, String rod_b, String rod_c) {
        int max_n_moves = (int) (Math.pow(2, k_discs) - 1); 
        int bound =(int) Math.pow(2, k_discs - 1);
        if(move > max_n_moves){
            return "Not valid";
        } else if(move == bound ){
            return rod_a + " -> " + rod_b;
        } else if(move < bound){
            return HanoiRec(k_discs-1, move , rod_a, rod_c, rod_b);
        } else {
            return HanoiRec(k_discs-1, move - bound, rod_c, rod_b, rod_a);
        }
    }


如何使用相同的方法找到第n個配置?

例如:

N_th_configuation(3, 4) #{rod_a: 0, rod_b: 1, rod_c: 2}

添加:3張光盤的二進制樹(按照上面的代碼):


                                (0  1  2)
                               /         \
                        (1 1 1)           (0 2 1)
                       /       \         /       \
                    (2 1 0)  (1 0 2)  (1 1 1)  (0 3 0)

其中第一個數字是rod_a上的光盤數量,第二個是rod_b上的光盤數量,第三個是rod_c上的光盤數量。 左下方的葉子是第一次移動后的配置,右下方的葉子是最后一次移動后的配置。 我沒有找到所有配置之間的關系。

ToH的規范解決方案是交替兩種類型的移動:

  1. 將最小的圓盤移至下一個桿(環繞式移回到初始桿)
  2. 采取包含最小光盤的合法措施。

wlog(不失一般性),我們假設最小的光盤始終移動到下一個編號更高的桿(標記為0、1、2)。

該算法的結果是奇數個光盤移動得更高。 偶數編號的碟片下降得更低。

另一個結果是,您可以為任何給定的移動編號獨立確定光盤:它是該編號的二進制表示形式中的最低值1位。 例如,對於三碟問題:

Move  binary disc
  1     001    1
  2     010    2
  3     011    1
  4     100    3
  5     101    1
  6     110    2
  7     111    1

要找到與任何移動N相匹配的位置:

  1. 將二進制文件分成單獨的數字。
  2. 屏蔽掉所有位最右側的1在每個位。
  3. 添加列。
  4. 否定偶數列(以表明光盤朝相反方向移動)。
  5. 降低總模量3。

結果是每個光盤都位於其上的列的列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM