Hi, ich hab ein Programm geschrieben und bin mir aber unsicher ob ich die Aufgabenstellung erfüllt hab, wäre cool wenn mal jemand drüber gucken kann .
Betrachten Sie folgende Denksportaufgabe:
Ein Bauer (B), ein Huhn (H), ein Fuchs (F) und Getreide (G) befinden sich am Ufer eines Flusses. Der Bauer mo ̈chte mit einem Boot alles auf das andere Ufer bringen. Leider kann der Bauer nur sich und ho ̈chstens eins der drei Dinge mit ins Boot nehmen. Wenn allerdings der Fuchs mit dem Huhn ohne den Bauern zusammen an einem Ufer bleibt, frisst der Fuchs das Huhn. Wenn das Huhn ohne den Bauern mit dem Getreide an einem Ufer bleibt, dann frisst das Huhn das Getreide. In welcher Reihenfolge muss der Bauer mit einem der drei Dinge von einem zu anderen Ufer fahren, damit sich alle zu Schluss am anderen Ufer befinden?
Dieses Problem la ̈sst sich systematisch mit einem endlichen Automaten lo ̈sen. Ein einzelner Zustand des Automaten beschreibt, welche Dinge sich am welchen Ufer befindet. Eine Transition beschreibt das U ̈bersetzen des Bauern mit einen der drei Dingen.
Folgender Automat zeigt den Anfangszustand und zwei mo ̈gliche Zustandsu ̈berga ̈nge. Die Dinge am linken Ufer sind im Zustandsknoten oberhalb der Dinge am rechten Ufer angegeben. Wenn der Bauer alleine u ̈bersetzt, dann frisst der Fuchs das Huhn. Aus diesem Endzustand kommt der Bauer nicht mehr heraus. Beim anderen Zustandsu ̈bergang fa ̈hrt der Bauer mit dem Huhn u ̈ber das Ufer. Wenn er mit dem Huhn wieder zuru ̈ckfa ̈hrt, dann befindet sich der Automat im Anfangszustand.
Erweitern Sie den Automaten um alle mo ̈glichen Zustandsu ̈bergange und Zusta ̈nde.
Lesen Sie daraus die ku ̈rzeste mo ̈gliche Lo ̈sung ab.
Auch wenn das Problem jetzt gelo ̈st ist, soll dieser Automat noch implementiert werden, um
eine komplette Simulation zu erhalten.
Die Zusta ̈nde werden am besten mit ganzen Zahlen codiert: Nummerieren Sie alle Zusta ̈nde der Reihe nach durch. Da bei einer Transition immer der Bauer mit dabei ist, reicht es aus, die drei Dinge und Nichts mit ganzen Zahlen zu codieren.
Implementieren Sie eine Klasse, mit einer Funktion
public static int bootFahren(int aktuellerZustand, int ding),
die die Zustandsu ̈bergangstabelle des Automaten implementiert. Die Funktion soll den Folge-
zustand als Funktionswert zuru ̈ckgeben. Fu ̈r nicht definierte Fa ̈lle, kann die Funktion einfach -1 zuru ̈ckgeben. Sie werden viele Fallunterscheidungen beno ̈tigen.
Sie ko ̈nnen die Klasse noch um eine weitere Funktion erweitern, die einen Zustand als Parameter u ̈bergeben bekommt, um dann einen zugeho ̈rigen Text auf dem Bildschirm auszugeben, wie etwa ”Linkes Ufer: Bauer und Huhn. Rechtes Ufer: Fuchs und Getreide” oder ”Fuchs frisst Huhn”.
Rufen Sie die Methoden alle in der richtigen Reihenfolge auf, so dass der Bauer alles vom linken zum rechten Ufer schafft
Betrachten Sie folgende Denksportaufgabe:
Ein Bauer (B), ein Huhn (H), ein Fuchs (F) und Getreide (G) befinden sich am Ufer eines Flusses. Der Bauer mo ̈chte mit einem Boot alles auf das andere Ufer bringen. Leider kann der Bauer nur sich und ho ̈chstens eins der drei Dinge mit ins Boot nehmen. Wenn allerdings der Fuchs mit dem Huhn ohne den Bauern zusammen an einem Ufer bleibt, frisst der Fuchs das Huhn. Wenn das Huhn ohne den Bauern mit dem Getreide an einem Ufer bleibt, dann frisst das Huhn das Getreide. In welcher Reihenfolge muss der Bauer mit einem der drei Dinge von einem zu anderen Ufer fahren, damit sich alle zu Schluss am anderen Ufer befinden?
Dieses Problem la ̈sst sich systematisch mit einem endlichen Automaten lo ̈sen. Ein einzelner Zustand des Automaten beschreibt, welche Dinge sich am welchen Ufer befindet. Eine Transition beschreibt das U ̈bersetzen des Bauern mit einen der drei Dingen.
Folgender Automat zeigt den Anfangszustand und zwei mo ̈gliche Zustandsu ̈berga ̈nge. Die Dinge am linken Ufer sind im Zustandsknoten oberhalb der Dinge am rechten Ufer angegeben. Wenn der Bauer alleine u ̈bersetzt, dann frisst der Fuchs das Huhn. Aus diesem Endzustand kommt der Bauer nicht mehr heraus. Beim anderen Zustandsu ̈bergang fa ̈hrt der Bauer mit dem Huhn u ̈ber das Ufer. Wenn er mit dem Huhn wieder zuru ̈ckfa ̈hrt, dann befindet sich der Automat im Anfangszustand.
Erweitern Sie den Automaten um alle mo ̈glichen Zustandsu ̈bergange und Zusta ̈nde.
Lesen Sie daraus die ku ̈rzeste mo ̈gliche Lo ̈sung ab.
Auch wenn das Problem jetzt gelo ̈st ist, soll dieser Automat noch implementiert werden, um
eine komplette Simulation zu erhalten.
Die Zusta ̈nde werden am besten mit ganzen Zahlen codiert: Nummerieren Sie alle Zusta ̈nde der Reihe nach durch. Da bei einer Transition immer der Bauer mit dabei ist, reicht es aus, die drei Dinge und Nichts mit ganzen Zahlen zu codieren.
Implementieren Sie eine Klasse, mit einer Funktion
public static int bootFahren(int aktuellerZustand, int ding),
die die Zustandsu ̈bergangstabelle des Automaten implementiert. Die Funktion soll den Folge-
zustand als Funktionswert zuru ̈ckgeben. Fu ̈r nicht definierte Fa ̈lle, kann die Funktion einfach -1 zuru ̈ckgeben. Sie werden viele Fallunterscheidungen beno ̈tigen.
Sie ko ̈nnen die Klasse noch um eine weitere Funktion erweitern, die einen Zustand als Parameter u ̈bergeben bekommt, um dann einen zugeho ̈rigen Text auf dem Bildschirm auszugeben, wie etwa ”Linkes Ufer: Bauer und Huhn. Rechtes Ufer: Fuchs und Getreide” oder ”Fuchs frisst Huhn”.
Rufen Sie die Methoden alle in der richtigen Reihenfolge auf, so dass der Bauer alles vom linken zum rechten Ufer schafft
Java:
package Aufgabenblatt5;
public class Bauer {
public static int bootFahren(int aktuellerZustand, int ding) {
int folgeZustand = 0;
if (aktuellerZustand == 0) {
switch (ding) {
case 0 : folgeZustand = 2;
break;
case 1 : folgeZustand = 1;
break;
case 2 : folgeZustand = 4;
break;
case 3 : folgeZustand = 3;
}
}
if (aktuellerZustand == 4) {
switch (ding) {
case 0 : folgeZustand = 5;
break;
case 1 : folgeZustand = -1;
break;
case 2 : folgeZustand = 0;
break;
case 3 : folgeZustand = -1;
}
}
if (aktuellerZustand == 5) {
switch (ding) {
case 0 : folgeZustand = 4;
break;
case 1 : folgeZustand = 8;
break;
case 2 : folgeZustand = -1;
break;
case 3 : folgeZustand = 6;
}
}
if (aktuellerZustand == 6) {
switch (ding) {
case 0 : folgeZustand = 13;
break;
case 1 : folgeZustand = -1;
break;
case 2 : folgeZustand = 7;
break;
case 3 : folgeZustand = 5;
}
}
if (aktuellerZustand == 7) {
switch (ding) {
case 0 : folgeZustand = 3;
break;
case 1 : folgeZustand = 10;
break;
case 2 : folgeZustand = 6;
break;
case 3 : folgeZustand = -1;
}
}
if (aktuellerZustand == 8) {
switch (ding) {
case 0 : folgeZustand = 14;
break;
case 1 : folgeZustand = 5;
break;
case 2 : folgeZustand = 9;
break;
case 3 : folgeZustand = -1;
}
}
if (aktuellerZustand == 9) {
switch (ding) {
case 0 : folgeZustand = 1;
break;
case 1 : folgeZustand = -1;
break;
case 2 : folgeZustand = 8;
break;
case 3 : folgeZustand = 10;
}
}
if (aktuellerZustand == 10) {
switch (ding) {
case 0 : folgeZustand = 11;
break;
case 1 : folgeZustand = 7;
break;
case 2 : folgeZustand = -1;
break;
case 3 : folgeZustand = 9;
}
}
if (aktuellerZustand == 11) {
switch (ding) {
case 0 : folgeZustand = 10;
break;
case 1 : folgeZustand = -1;
break;
case 2 : folgeZustand = 12;
break;
case 3 : folgeZustand = -1;
}
}
aktuellerZustand = folgeZustand;
return aktuellerZustand;
}
public static void main(String[] args) {
switch (bootFahren(4,0)) {
case -1: System.out.println("Nicht definierter Fall.");
break;
case 0: System.out.println("Linkes Ufer: Bauer, Fuchs, Huhn und Getreide. Rechtes Ufer: Leer.");
break;
case 1: System.out.println("Huhn frisst Getreide.");
break;
case 2: System.out.println("Fuchs frisst Huhn oder Huhn frisst Getreide.");
break;
case 3: System.out.println("Fuchs frisst Huhn.");
break;
case 4: System.out.println("Linkes Ufer: Fuchs und Getreide. Rechtes Ufer: Bauer und Huhn.");
break;
case 5: System.out.println("Linkes Ufer: Bauer, Fuchs und Getreide. Rechtes Ufer: Huhn.");
break;
case 6: System.out.println("Linkes Ufer: Fuchs. Rechtes Ufer: Bauer, Huhn und Getreide.");
break;
case 7: System.out.println("Linkes Ufer: Bauer, Fuchs und Huhn. Rechtes Ufer: Getreide.");
break;
case 8: System.out.println("Linkes Ufer: Getreide. Rechtes Ufer: Bauer, Fuchs und Huhn.");
break;
case 9: System.out.println("Linkes Ufer: Bauer, Huhn und Getreide. Rechtes Ufer: Fuchs.");
break;
case 10: System.out.println("Linkes Ufer: Huhn. Rechtes Ufer: Bauer, Fuchs und Getreide.");
break;
case 11: System.out.println("Linkes Ufer: Bauer und Huhn. Rechtes Ufer: Fuchs und Getreide.");
break;
case 12: System.out.println("Linkes Ufer: Leer. Rechtes Ufer: Bauer, Fuchs, Huhn und Getreide. Sie haben das Rätsel gelöst. Glückwunsch!");
break;
case 13: System.out.println("Huhn frisst Getreibe.");
break;
case 14: System.out.println("Fuchs frisst Huhn.");
}
}
}