Türme von Hanoi mit einer beliebigen aber gültigen Eingabe lösen

Bobi

Bekanntes Mitglied
Hallo,

Ich habe ein Problem, welches ich nicht lösen kann.
Ich muss ein Programm für Hanoi Türme in Java schreiben.
Dieses Programm solle von beliebige aber valide start die Scheiben an das Ziel Stab
stecken.
valid meine ich damit, dass man kleine scheibe oberhalb der größere scheiben liegen muss.

Also z.B es könnte solche Ausgangsposition geben StabA hat 6,5,4 StabB 7,3 StabC 2,1
Das Programm muss das Problem rekursiv lösen.

Für jeden kleine Tipp bin ich dankbar.
 
Ich habs mal versucht. Es scheint zu funktionieren.
Java:
import java.util.ArrayList;
import java.util.List;

public class Hanoi {
  static int removeLast(List<Integer> list) {
    int last = list.get(list.size() - 1);
    list.remove(list.size() - 1);
    return last;
  }
 
  static void moveOne(List<Integer> list1, List<Integer> list2) {
    list2.add(removeLast(list1));
  }
 
  static void print(List<List<Integer>> poles) {
    int height = 0;
    for(var pole: poles) {
      if(pole.size() > height) height = pole.size();
    }
    for(int h = height - 1; h >= 0; h--) {
      for(var pole: poles) {
        if(pole.size() > h) {
          System.out.print(pole.get(h));
        } else {
          System.out.print(" ");
        }
        System.out.print(" ");
      }
      System.out.println();
    }
    System.out.println();
  }
 
  static void move(List<List<Integer>> poles, int maxDiskSize, int destPole) {
    if(maxDiskSize < 1) return;
    int fromPole = 0;
    loop:
    for(; fromPole < poles.size(); fromPole++) {
      for(int diskNr = 0; diskNr < poles.get(fromPole).size(); diskNr++) {
        if(poles.get(fromPole).get(diskNr) == maxDiskSize) break loop;
      }
    }
    if(fromPole == destPole) {
      move(poles, maxDiskSize - 1, destPole);
    } else {
      int mid = 0;
      while(mid == destPole || mid == fromPole) mid++;
      move(poles, maxDiskSize - 1, mid);
      moveOne(poles.get(fromPole), poles.get(destPole));
      print(poles);
      move(poles, maxDiskSize - 1, destPole);
    }
  }
 
  public static void main(String[] args) {
    List<List<Integer>> poles = new ArrayList<>();
    poles.add(new ArrayList<>(List.of(6,5,4)));
    poles.add(new ArrayList<>(List.of(7,3)));
    poles.add(new ArrayList<>(List.of(2,1)));
    print(poles);
   
    move(poles, 7, 2);
  }
}
 

Neue Themen


Zurück
Oben