資料結構Java實現——①棧-->棧的應用四、漢諾塔問題
阿新 • • 發佈:2018-12-30
寫在前面
只是學棧的描述之類的似乎很無聊,所以我特意找了幾個比較有意思的例子,一則加深對棧的理解和運用,二則,也可以開拓一下思路,此為例四
例四、漢諾塔
1、問題描述
漢諾塔:漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。
2、結論
①如果只能移動到相鄰的 那麼n個圓盤需要
f(n)=(3^n)-1 次
②如果不加上只能移動到相鄰的限制的話 那麼n個圓盤需要f(n)=(2^n)-1次
3、程式碼實現
package org.Stone6762.MStack.adopt; /** * @ClassName_Hanoi漢諾塔問題 * @author_Stone6762 */ public class Hanoi { /** * @count記錄是第幾次移動 */ private static int count = 0; /** * @Describe_將塔座x上按直徑大小自上而下編碼為123...n個圓盤按規則一到塔座Z上_y做輔助塔座 * @param n圓盤的格式 * @param x起始圓盤的位置 * @param y輔助塔座 * @param z目標塔座 */ public static void hanoi(int n, char x, char y, char z) { if (n == 1) { move(x, 1, z);// } else { hanoi(n - 1, x, z, y);// 將前n-1個從x移動到y,z當輔助 move(x, n, z);// 將變化為n的圓盤從x移動到z hanoi(n - 1, y, x, z);// 再將前n-1個圓盤從y移動到z,x當輔助 } } /** * @Describe_移動操作_將編號為n的圓盤從x移動到z * @param x * @param n * @param z */ public static void move(char x, int n, char z) { System.out.println("第 " + (++count) + "次移動 :" + n + "號圓盤," + x + "-->" + z); } /** * @Describe_規則再次變化_再加上一個只能移動到相鄰的限制條件 * @param n * @param x * @param y * @param z */ public static void hanoi2(int n, char x, char y, char z) { if (n == 1) { move(x, 1, y);// move(y, 1, z);// } else { hanoi2(n - 1, x, y, z);// 將前n-1個從x移動到z,y當輔助 move(x, n, y);// 將變化為n的圓盤從x移動到y hanoi2(n - 1, z, y, x);// 再將前n-1個圓盤從z移動到x,y當輔助 move(y, n, z);// 將變化為n的圓盤從y移動到z hanoi2(n - 1, x, y, z);// 將前n-1個從x移動到z,y當輔助 } } public static void main(String[] args) { // Hanoi.hanoi(4, 'x', 'y', 'z');//------可以移動到相鄰的或者不相鄰的 // Hanoi.hanoi2(4, 'x', 'y', 'z');//-----只能移動到相鄰的 } }