Created
April 24, 2017 09:12
-
-
Save lasagnaphil/2870111a73bc59ac75b38d09cdcc8611 to your computer and use it in GitHub Desktop.
Hanoi full code (java)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.util.Scanner; | |
public class Main { | |
public static void main(String[] args) { | |
Hanoi hanoi = new Hanoi(); | |
hanoi.run(); | |
} | |
} | |
class Hanoi | |
{ | |
private HanoiTower[] towers; | |
private int numOfDisks; | |
private int turns; | |
private Scanner scanner; | |
public Hanoi() | |
{ | |
turns = 0; | |
scanner = new Scanner(System.in); | |
System.out.println("Enter number of disks : "); | |
numOfDisks = scanner.nextInt(); | |
towers = new HanoiTower[3]; | |
for (int i = 0; i < 3; i++) | |
{ | |
towers[i] = new HanoiTower(numOfDisks); | |
} | |
towers[0].insertAllDisks(); | |
} | |
public void run() | |
{ | |
turns = 0; | |
executeTurn(numOfDisks, towers[0], towers[1], towers[2]); | |
System.out.println("Minimum number of moves : " + turns); | |
} | |
private void executeTurn(int n, HanoiTower source, HanoiTower via, HanoiTower dest) | |
{ | |
if (n > 0) | |
{ | |
executeTurn(n - 1, source, dest, via); | |
dest.insertDisk(source.removeDisk()); | |
turns++; | |
draw(); | |
executeTurn(n - 1, via, source, dest); | |
} | |
} | |
public void draw() | |
{ | |
System.out.println(); | |
int n = numOfDisks; | |
for (int i = n-1; i >= 0; i--) | |
{ | |
drawDisk(n, towers[0].getDisks()[i]); | |
System.out.print("\t"); | |
drawDisk(n, towers[1].getDisks()[i]); | |
System.out.print("\t"); | |
drawDisk(n, towers[2].getDisks()[i]); | |
System.out.println(); | |
} | |
System.out.println(); | |
} | |
private void drawDisk(int n, int diskSize) | |
{ | |
for (int i = 0; i <= 2*n; i++) | |
{ | |
if (i < n - diskSize || i > n + diskSize) | |
{ | |
System.out.print(' '); | |
} | |
else if (i != n) | |
{ | |
System.out.print('*'); | |
} | |
else | |
{ | |
System.out.print('|'); | |
} | |
} | |
} | |
public int getNumOfDisks() { return numOfDisks; } | |
public int getTurns() { return turns; } | |
} | |
class HanoiTower | |
{ | |
private final int maxDisks; | |
private int[] disks; | |
private int diskCount; | |
public HanoiTower(int maxDisks) { | |
this.maxDisks = maxDisks; | |
disks = new int[maxDisks]; | |
} | |
public void insertAllDisks() { | |
for (int i = 0; i < maxDisks; i++) { | |
disks[i] = maxDisks - i; | |
} | |
diskCount = maxDisks; | |
} | |
public void insertDisk(int diskSize) { | |
if (diskCount == maxDisks) { | |
System.out.println("Tower is full!"); | |
return; | |
} | |
disks[diskCount] = diskSize; | |
diskCount++; | |
} | |
public int removeDisk() { | |
if (diskCount == 0) { | |
System.out.println("Tower is empty!"); | |
return 0; | |
} | |
int removedDisk = disks[diskCount - 1]; | |
disks[diskCount - 1] = 0; | |
diskCount--; | |
return removedDisk; | |
} | |
// getters | |
public int[] getDisks() { return disks; } | |
public int getDiskCount() { return maxDisks; } | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment