[英]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的規范解決方案是交替兩種類型的移動:
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
在每個位。 結果是每個光盤都位於其上的列的列表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.