BohYoh.comトップページへ

Javaによるアルゴリズムとデータ構造

戻る  

演習5-7の解答

 メソッドmove を非再帰的に実現せよ。

// 演習5-7 // ハノイの塔(非再帰的に実現) import java.util.Scanner; class HanoiN {     //--- 円盤をx軸からy軸へ移動 ---//     static void move(int no, int x, int y) {         int[] xstk = new int[100];         int[] ystk = new int[100];         int[] sstk = new int[100];        // スタック         int ptr = 0;                    // スタックポインタ         int sw = 0;         while (true) {             if (sw == && no > 1) {                 xstk[ptr= x;                // xの値をプッシュ                 ystk[ptr= y;                // yの値をプッシュ                 sstk[ptr= sw;                // swの値をプッシュ                 ptr++;                 no = no - 1;                 y = 6  - x - y;                 continue;             }             System.out.printf("[%d]を%d軸から%d軸へ移動\n", no, x, y);             if (sw == && no > 1) {                 xstk[ptr= x;                // xの値をプッシュ                 ystk[ptr= y;                // yの値をプッシュ                 sstk[ptr= sw;                // swの値をプッシュ                 ptr++;                 no = no - 1;                 x = 6  - x - y;                 if (++sw == 2sw = 0;                 continue;             }             do {                 if (ptr-- == 0)                // スタックが空になったら                     return;                     x  = xstk[ptr];                // 値を保存していたxをポップ                 y  = ystk[ptr];                // 値を保存していたyをポップ                 sw = sstk[ptr1;            // 値を保存していたswをポップ                 no++;             while (sw == 2);         }     }     public static void main(String[] args) {         Scanner stdIn = new Scanner(System.in);         System.out.println("ハノイの塔");         System.out.print("円盤の枚数:");         int    n = stdIn.nextInt();         move(n, 13);    // 第1軸に積まれたn枚を第3軸に移動     } }


戻る