class HanoiTurm {
/*
* jede Scheibe wird durch einen String dargestellt je laenger der String,
* derst groesser ist die Scheibe in values werden somit die Scheiben
* abgelegt
*/
private String[] values;
// position gibt die Position der obersten Scheibe an
private int position;
// Konstruktor(keine Scheibe vorhanden, Stabgroeße ist 1)
public HanoiTurm() {
position = -1;
values = new String[1];
}
// Konstruktor(keine Scheibe vorhanden, Stabgroesse wird gesetzt)
public HanoiTurm(int groesse) {
position = -1;
values = new String[groesse];
}
// gibt die max Anzahl an Scheiben auf dem Stab zurueck.
public int maxSize() {
return values.length;
}
// Gibt die oberste Scheibe zurück, falls sie nicht vorhanden ist
// wird eine Fehlermeldung und null ausgegeben.
public String top() {
if (position != -1){
return values[position];
}
else {
System.out.println("Der Stab ist leer!");
return null;
}
}
// Die position wird um eins verringert, und stellt somit die verbleibende
// oberste Scheibe da. Der zu entfernende String wird = null gesetzt.
public void pop() {
if (position==-1) {
System.out.println("Keine Scheibe vorhanden");
}
else{
values[position]= "";
position--;
}
}
/*
Es wird geprüft ob der Stab voll ist oder die Scheibe zu
groß und eine entsprechende Fehlermeldung ausgegeben
Ist die Scheibe kleiner als die vorhendene oder keine vor
handen, wird eine neue eingefuegt.
*/
public void push(String neu) {
if (position==values.length-1){
System.out.println("Der Stab ist voll");
}
if (position != -1 && neu.length() > values[position].length()){
System.out.println("Die Scheibe ist zu groß");
}
if(position ==-1||neu.length()<values[position].length()){
values[position+1]=neu;
position++;
}
}
// gibt die Position um eins erhöht wieder um die
// Anzahl an vorhandenen Scheiben zu erhalten.
public int size() {
return position+1;
}
}
public class TuermeVonHanoi {
public static void main(String[] args) {
int groesse;
int a=0;
int zaehler=0;
groesse = Integer.parseInt(args[0]);
// Es werden drei neue staebe erzeugt.
HanoiTurm stab1 = new HanoiTurm(groesse);
HanoiTurm stab2 = new HanoiTurm(groesse);
HanoiTurm stab3 = new HanoiTurm(groesse);
System.out.println("Stabgroesse: " + stab1.maxSize());
StringBuilder scheibe = new StringBuilder();
// Die erste Scheibe wird erzeugt und an stab1 uebergeben.
for (int i = 0; i < groesse; i++) {
scheibe.append("/\\");
}
String scheibeReady =new String(scheibe);
stab1.push(scheibeReady);
// Die restlichen Scheiben werden erzeugt und an stab1 uebergeben.
for (int i = 0; i < groesse - 1; i++) {
int ende = (groesse*2)-a;
int start = (groesse*2-2)-a;
scheibe.delete(start, ende);
a= a+2;
String scheibeReady2 =new String(scheibe);
stab1.push(scheibeReady2);
}
zaehler= bewege(groesse, stab1, stab2, stab3,zaehler);
System.out.println(zaehler);
}
// Der aus Wikipedia stammende rekursive Algorithmus wird in einer eigenen
// Methode formuliert. Der Methode werden die Parameter der Scheibenanzahl
// und die drei staebe der Klasse HanoiTurm uebergeben.
private static int bewege(int i,HanoiTurm a,HanoiTurm b,HanoiTurm c,int zaehler) {
if(i>0){
zaehler=zaehler+bewege(i-1,a,c,b,zaehler);
c.push(a.top()); //auf Stab c wird die oberste Scheibe von a gesetzt
a.pop(); //die oberste Scheibe wird gelöscht
zaehler=zaehler+bewege(i-1,b,a,c,zaehler);
}
return ++zaehler;
}
}