\documentclass{bschlangaul-aufgabe} \bLadePakete{java,grafik} \begin{document} \bAufgabenMetadaten{ Titel = {Aufgabe 5 (Backtracking)}, Thematik = {Springerproblem beim Schach}, Referenz = 46115-2018-H.T2-A5, RelativerPfad = Examen/46115/2018/09/Thema-2/Aufgabe-5.tex, ZitatSchluessel = examen:46115:2018:09, ZitatBeschreibung = {Seite 11-12}, BearbeitungsStand = mit Lösung, Korrektheit = unbekannt, Ueberprueft = {unbekannt}, Stichwoerter = {Backtracking}, EinzelpruefungsNr = 46115, Jahr = 2018, Monat = 09, ThemaNr = 2, AufgabeNr = 5, } \let\j=\bJavaCode Das \emph{Springerproblem} ist ein kombinatorisches Problem, das darin besteht, für einen Springer auf einem leeren Schachbrett eine Route von einem gegebenen Startfeld aus zu finden, auf der dieser jedes Feld des Schachbretts genau einmal besucht.\index{Backtracking} \footcite[Seite 11-12]{examen:46115:2018:09} Ein Schachbrett besteht aus $8 \times 8$ Feldern. Ein Springer kann bei einem Zug von einem Ausgangsfeld aus eines von maximal $8$ Folgefelder betreten, wie dies in der folgenden Abbildung dargestellt ist. Der Springer darf selbstverständlich nicht über den Rand des Schachbretts hinausspringen. \begin{center} \begin{tikzpicture}[x=6mm,y=6mm] \draw[fill=black!30,even odd rule] (0,0) foreach \n in {1,2,3,4} { -- ++ (8,0) -- ++ (0,1) -- ++ (-8,0) -- ++ (0,1) } -- (8,8) foreach \n in {1,2,3,4} { -- ++ (0,-8) -- ++ (-1,0) -- ++ (0,8) -- ++ (-1,0) } -- cycle foreach[count=\n] \m in {a,b,...,h} { (-0.4,\n-0.5) node {\n} (\n-0.5,-0.5) node {\m} }; \end{tikzpicture} \end{center} Eine Lösung des Springerproblems mit Startfeld \j{h1} sieht wie folgt aus. Die Felder sind in ihrer Besuchsreihenfolge durchnummeriert. Der Springer bewegt sich also von \j{h1} nach \j{f2}, dann von \j{f2} nach \j{h3} usw. \begin{center} \begin{tabular}{cccccccc} 41&10&29&26&49&12&31&16\\ 28&25&40&11&30&15&50&13\\ 9&42&27&56&61&48&17&32\\ 24&39&58&47&64&53&14&51\\ 43&8&55&62&57&60&33&18\\ 38&23&46&59&54&63&52&3\\ 7&44&21&36&5&2&19&34\\ 22&37&6&45&20&35&4&1\\ \end{tabular} \end{center} \noindent Formulieren Sie einen rekursiven Algorithmus zur Lösung des Springerproblems von einem vorgegebenen Startfeld aus. Es sollen dabei alle möglichen Lösungen des Springerproblems gefunden werden. Die Lösungen sollen durch Backtracking gefunden werden. Hierbei werden alle möglichen Teilrouten systematisch durchprobiert, und Teilrouten, die nicht zu einer Lösung des Springerproblems führen können, werden nicht weiterverfolgt. Dies ist durch rekursiven Aufruf einer Lösungsfunktion \j{huepf(z, y, z)} zu realisieren, wobei \begin{itemize} \item \j{x} und \j{y} die Koordinaten des als nächstes anzuspringenden Feldes sind, und \item \j{z} die aktuelle Rekursionstiefe enthält. Wenn die Rekursionstiefe $64$ erreicht und das betreffende Feld noch unbesucht ist, ist eine Lösung des Springerproblems gefunden. \end{itemize} Der initiale Aufruf Ihres Algorithmus kann beispielsweise über den Aufruf \begin{center} \j{huepf(1, 8, 1)} \end{center} erfolgen. Wählen Sie geeignete Datenstrukturen zur Verwaltung der unbesuchten Felder und zum Speichern gefundener (Teil)Lösungen. Der Algorithmus soll eine gefundene Lösung in der oben angegebenen Form ausdrucken, also als Matrix mit der Besuchsreihenfolge pro Feld. \begin{bAntwort} \bJavaExamen{46115}{2018}{09}{Springerproblem} \end{bAntwort} \end{document}