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--];
}
}