Skip to content

Instantly share code, notes, and snippets.

@lasagnaphil
Created April 24, 2017 09:12
Show Gist options
  • Save lasagnaphil/2870111a73bc59ac75b38d09cdcc8611 to your computer and use it in GitHub Desktop.
Save lasagnaphil/2870111a73bc59ac75b38d09cdcc8611 to your computer and use it in GitHub Desktop.
Hanoi full code (java)
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