JAvaハノータHanoi再帰、非再帰(擬似システム再帰)、および非再帰法則実装コード

9251 ワード

手順は次のとおりです.
 
  
View Code
 /*
  * Hanoi :
  * : ( ) 。
  * ,
  * 64 。
  * 。 , ,
  * 。
  *
  * fuction: hanoi
  *             1.
  *             2.
  * author:iGeneral
  * date:2013.04.26
  *
  * expe:
  *         1. : : status=1 , Disk
  *                 Disk id
  *         2.System.out.println();
           System.out.println((int)3.3%3);
           (int) , :0.299999
           (int) , :0
  */
 package part03.chapter10;

 import java.util.Scanner;

 public class _2exercise {

     public static void main(String[] args) {

         Scanner scanner = new Scanner(System.in);
         System.out.println(" Hanoi :");
         int diskNum = scanner.nextInt();
         Hanoi hanoi = new Hanoi();
         System.out.println(" :");
         hanoi.play_recursive(diskNum, 'A', 'B', 'C');
         System.out.println(" ( ):");
         hanoi.play_non_recursive(diskNum);
         System.out.println(" ( Hanoi ):");
         hanoi.play_regular(diskNum);

     }

 }

 class Hanoi {

     //
     public void play_recursive(int num, char A, char B, char C) {
         if (num == 1) {
             System.out.println(A + " -> " + C);
             return;
         } else {
             play_recursive(num - 1, A, C, B);
             System.out.println(A + " -> " + C);
             play_recursive(num - 1, B, A, C);
         }

     }

     // :
     public void play_non_recursive(int diskNum) {
         Stack stack = new Stack();
         stack.push(new Disk(diskNum, 'A', 'B', 'C'));
         Disk popDisk = null;
         while ((popDisk = stack.pop()) != null) {
             if (popDisk.status == 1) {
                 System.out.println(popDisk.A + " -> " + popDisk.C);
             } else {
                 //
                 // popDisk Disk Stack
                 stack.push(new Disk(popDisk.status - 1, popDisk.B, popDisk.A,
                         popDisk.C));
                 // status "1" popDisk Disk Stack
                 stack.push(new Disk(1, popDisk.A, popDisk.B, popDisk.C));
                 // popDisk Disk Stack
                 stack.push(new Disk(popDisk.status - 1, popDisk.A, popDisk.C,
                         popDisk.B));
             }
         }
     }

     // : Hanoi
     public void play_regular(int diskNum) {

         // , Disk ,
         // , “A->B->C”
         // , "A->C->B"
         // diskNum Disk ” “ A ( ), B C
         Stack_play_regular A = new Stack_play_regular('A');
         Stack_play_regular B = new Stack_play_regular('B');
         Stack_play_regular C = new Stack_play_regular('C');
         for (int i = diskNum; i > 0; i--) {
             A.push(i);
         }
         //
         Stack_play_regular[] towers = new Stack_play_regular[3];
         towers[0] = A;
         if (diskNum % 2 == 0) {
             towers[1] = B;
             towers[2] = C;
         } else {
             towers[1] = C;
             towers[2] = B;
         }
         // Dish , towers
         int towerOfMinimunDisk = 0;
         // :n Disk 2^n-1
         //
         // Disk
         // Disk ,
         // : Disk, Disk Disk Disk
         // : Disk, , Disk Disk
         // Disk ,
         int ii = 0;
         for (int i = 0; i < (Math.pow(2, diskNum) - 1);) {// -------------- i++
             // ,
             Stack_play_regular tower = towers[towerOfMinimunDisk];
             Stack_play_regular tower_1 = towers[(int) ((towerOfMinimunDisk + 1) % 3)];
             Stack_play_regular tower_2 = towers[(int) ((towerOfMinimunDisk + 2) % 3)];
             //
             System.out.println(tower.name + " -> " + tower_1.name);
             tower_1.push(tower.pop());
             i++;// -------------- i++
             towerOfMinimunDisk = (int) ((towerOfMinimunDisk + 1) % 3);
             // ------------ tower
             tower = towers[towerOfMinimunDisk];
             tower_1 = towers[(int) ((towerOfMinimunDisk + 1) % 3)];
             tower_2 = towers[(int) ((towerOfMinimunDisk + 2) % 3)];
             //
             if ((tower_2.getTop() != -1 && (tower_1.showTopDisk() > tower_2
                     .showTopDisk()))
             // -------------- tower_2.getTop() != -1
             // ,
                     || (tower_1.getTop() == -1 && tower_2.getTop() != -1)) {
                 System.out.println(tower_2.name + " -> " + tower_1.name);
                 tower_1.push(tower_2.pop());
                 i++;// -------------- i++
             } else if (((tower_1.getTop() != -1 && tower_1.showTopDisk() < tower_2
                     .showTopDisk()))
             // -------------- tower_1.getTop() != -1
             // ,
                     || (tower_1.getTop() != -1 && tower_2.getTop() == -1)) {
                 System.out.println(tower_1.name + " -> " + tower_2.name);
                 tower_2.push(tower_1.pop());
                 i++;// -------------- i++
             }
             ii = i;
         }
         System.out.println(ii);
     }

 }

 //
 class Disk {
     // A B C
     char A;
     char B;
     char C;
     // : status=1 , Disk
     int status;

     //
     public Disk(int status, char A, char B, char C) {
         this.status = status;
         this.A = A;
         this.B = B;
         this.C = C;
     }
 }

 // Disk
 class Stack {
     //
     Disk[] disks = new Disk[10000];
     //
     private int top = 0;

     //
     public Disk stackTop() {
         return disks[top];
     }

     //
     public Disk pop() {
         if (top != 0) {
             top--;
             return disks[top + 1];
         } else {
             return null;
         }
     }

     //
     public void push(Disk disk) {
         top++;
         disks[top] = disk;
     }
 }

 // play_regular(int diskNum) Stack
 // diskId Disk
 class Stack_play_regular {
     //
     char name;
     //
     private int top = -1;

     public int getTop() {
         return top;
     }

     // Stack, 64 Disk
     int[] stack = new int[64];

     // , name
     public Stack_play_regular(char name) {
         this.name = name;
     }

     //
     public int showTopDisk() {
         if (top == -1) {
             return -1;
         }
         return stack[top];
     }

     //
     public void push(int diskId) {
         stack[++top] = diskId;
     }

     //
     public int pop() {
         return stack[top--];
     }
 }