daily pastebin goal
42%
SHARE
TWEET

Untitled

a guest Nov 20th, 2017 45 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. In dieser Aufgabe geht es darum Irrgärten zu kartographieren. Ihr Programm wird in einem Irrgarten "ausgesetzt" und soll selbstständig durch den Irrgarten finden und dabei einen vollständigen Plan anfertigen.
  2.  
  3. Der Irrgarten
  4. Als Modell des Irrgartens steht Ihnen die Klasse Maze zur Verfügung. Ihrem Programm wird ein Maze-Objekt übergeben, auf dem Sie folgene Operationen ausführen können:
  5.  
  6. int width(): gibt die Gesamtbreite des Irrgartens zurück.
  7. int height(): gibt die Gesamthöhe des Irrgartens zurück.
  8. void walk(Direction direction): läuft in die angegebene Richtung.
  9. boolean isWall(Direction direction): Testet ob sich in der angegebenen Richtung eine Wand befindet.
  10. void mark(Direction direction): Setzt eine Markierung in die angegebene Richtung. Jedes Feld kann beliebig viele Markierungen in beliebige Richtungen enthalten. Eine Markierung auf einem Feld in beliebiger Richtung hat keinen Einfluss auf die Markierungen der Nachbarfelder.
  11. int marks(Direction direction): Gibt aus, wie viele Markierungen in der angegebenen Richtung auf dem aktuellen Feld sind.
  12. Richtungen werden durch die Klasse Maze.Direction umgesetzt. Es stehen folgende Möglichkeiten zur Verfügung:
  13.  
  14. LEFT
  15. AHEAD
  16. RIGHT
  17. BACK
  18. Die Richtung wird immer aus dem Blickwinkel des Agenten angegeben, der sich gerade in dem Irrgarten befindet.
  19.  
  20. Ein kurzes Beispiel zur Anwendung der Klasse Maze:
  21.  
  22. public void goBackIfNoLeftWay(Maze maze) {
  23.     if (!maze.isWall(Maze.Direction.LEFT)) {
  24.         maze.walk(Maze.Direction.LEFT);
  25.     } else {
  26.         maze.walk(Maze.Direction.BACK);
  27.     }
  28. }
  29.  
  30. Die gezeigte Methode prüft, ob sich links ein Gang befindet und biegt, falls ein Solcher existiert, links ab. Ansonsten kehrt das Programm um.
  31.  
  32. Der Algorithmus
  33. Um durch den Irrgarten zu kommen, ohne sich dabei zu verlaufen, wenden wir die Methode von Trémaux an. Dieser Algorithmus ermöglicht es, einen Irrgarten vollständig zu durchlaufen und dabei jeden Weg maximal zwei mal zu begehen.
  34.  
  35. Wichtig ist es zwischen Wegen und Plätzen zu unterscheiden. Ein Weg bietet nur eine Möglichkeit weiterzugehen. Wenn sich beispielsweise vor Ihnen eine Wand befindet und links genauso, rechts aber nicht, bleibt Ihnen keine andere Möglichkeit als rechts abzubiegen. Ein Platz hingegen stellt eine Kreuzung von Wegen dar, bietet also prinzipiell mehrere Möglichkeiten weiterzulaufen. Sackgassen stellen genauso Wege dar, da die einzige Möglichkeit darin besteht umzudrehen. Sie dürfen im Folgenden davon ausgehen dass ein Irrgarten immer mindestens einen Platz hat.
  36.  
  37. Markieren Sie, wenn sie einen Platz betreten, immer sowohl die Richtung, aus der Sie kamen, als auch diejenige, in die Sie weitergehen. (Selbst wenn das die selben Richtungen sind!)
  38. Erreichen Sie einen Platz gibt es folgende Möglichkeiten:
  39.  
  40. Sie waren noch nie hier (es gibt keine Markierungen): Gehen sie in eine beliebige Richtung weiter (nicht zurück!).
  41. Sie waren schon mal hier (es gibt Markierungen) aber die Richtung, aus der Sie kamen, ist nicht markiert: Drehen Sie um.
  42. Alle verfügbaren Abzweigungen haben mehr als eine Markierung: Sie sind fertig.
  43. Ansonsten nehmen Sie den Weg mit den wenigsten Markierungen.
  44. Die Klasse Explorer
  45. Erstellen Sie im Packet de.uniwue.gdp.labyrinth die Klasse Explorer.
  46.  
  47. Erstellen Sie in der Klasse Explorer eine Methode public String exploreMaze(Maze z). Sie soll eine Karte des übergebenen Irrgartens erstellen und diese als String zurückgeben. Sie dürfen davon ausgehen, dass Sie in der linken oberen Ecke des Irrgartens starten und nach unten schauen. Dabei sollen betretbare Felder durch Leerzeichen und Wände durch das Zeichen '#' dargestellt werden.
  48.  
  49. Der zurückgegebene String könnte dabei zum Beispiel folgendermaßen aussehen.
  50.  
  51. /courses/23410/assignments/9794196/user/s363310/instructions/resources/base/ex01.png
  52.  
  53. Sie starten links oben mit Blick nach unten. Der Aufruf Maze.isWall(Maze.Direction.LEFT) würde also false zurückgeben. Daraufhin können Sie sich mit Hilfe von Trémaux' Methode durch den Irrgarten bewegen und dabei festhalten, wo sich Wege befinden.
  54.  
  55. Testen
  56. Um Ihr Programm vor Abgabe zu testen, steht Ihnen eine Bibliothek mit zwei Irrgärten als Beispiel zur Verfügung. Sie können diese durch die Methoden Examples.example01() und Examples.example02() aufrufen. Sie geben jeweis Objekte vom Typ Maze zurück, die Sie an Ihre exploreMaze-Methode übergeben können.
  57.  
  58. example01 liefert den oben gezeigten Irrgarten.
  59.  
  60. Der durch example02 erzeugte Irrgarten ist folgendermaßen aufgebaut:
  61.  
  62. /courses/23410/assignments/9794196/user/s363310/instructions/resources/base/ex02.png
RAW Paste Data
Top