-----------------------------------------------------------------------------

    ct-puzzle.zip: Beitrag zum Programmierwettbewerb aus c't Heft 7/2003

    Copyright (c) Andreas Zapf 2003. Alle Rechte vorbehalten.

-----------------------------------------------------------------------------


Dieses Archiv enthlt:
----------------------

solve.exe: Ermittelt die Anzahl der mglichen Lsungen lt. Aufgabenstellung.
           Lauffhig unter Windows 9x, NT, 2000, XP (hoffentlich ;).

source:    Enthlt die zugehrigen Delphi5-Quelldateien, so weit fr die 
           Prfung der Implementierung relevant (es fehlen einige lib-units,
           die mit dem Puzzle nichts zu tun haben).


Syntax fr solve.exe:
---------------------

   solve [-ma|-mp] [-s|-S] [-t0..t8] [-?] [-f:datei]

   -ma       Assembler-Lsungsroutine benutzen
   -mp       Pascal-Lsungsroutine benutzen
             Default: -ma

   -s        Weniger Zwischenausgaben
   -S        Keine Zwischenausgaben

   -t0..t8   Anzahl Lsungs-Threads, t0: kein Multithreading
             Default: -t2

   -?        Diesen Text anzeigen

   -f:datei  Ausgabedatei fr die Lsungen (binr, nur fr Testzwecke)
             ACHTUNG: Datei wird ohne Nachfrage berschrieben.


Beschreibung der Lsung:
------------------------

Das Programm verwendet im wesentlichen die selben Methoden wie die 
Lochwrfel-Lsung aus dem Heft:

Die Positionen des Puzzles sind als Bitfeld abgebildet (hier 60 Bits).

Eine Puzzle-Klasse enthlt eine Liste von Teilen, die Teile bestehen aus
Listen von Bitfeldern mit allen mglichen Positionen eines Teils im Puzzle.
Auf zustzliche Informationen wie den Aufdruck wurde verzichtet (deshalb
kann das Programm die Lsung mit dem Logo nicht errechnen...)

Die Lsungsroutine ist im Prinzip identisch wie beim Lochwrfel:
Stelle die nchste freie Position fest, suche ein unbenutztes Teil, 
das dort hinpasst und lege es hin. 
Gibt es keine unbenutzten Teile mehr, dann hast du eine Lsung gefunden, 
wenn doch, suche das nchste passende Teil usw. usw...

Der Erweiterungansatz besteht darin, die Suche nach den passenden 
Varianten eines hinzulegenden Teils mglichst kurz zu halten.

Weil neue Teile immer an die niedrigste freie Position des Puzzles
gelegt werden, brauchen Varianten, die Bits unterhalb dieser Position
haben, gar nicht erst bercksichtigt zu werden (alle diese Bits mssen
im Puzzle ja schon belegt sein). Das heit, es knnen nur Varianten passen,
deren erstes belegtes Bit genau an der zu besetzenden Position ist.

Deshalb enthlt ein Puzzle-Teil in diesem Programm nicht eine einzige Liste 
aller vorhandenen Varianten, sondern eine fr jede Position des Puzzles.
In jeder dieser Listen befinden sich nur die Varianten, deren erstes Bit
an der jeweiligen Position liegt. 

Beispiel: Das Teil 5 (das nicht flache 5er-Teil mit dem Apostroph) passt 
in 576 Varianten in das Puzzle, die lngste positionsbezogene Liste enthlt
gerade mal 24 Varianten...

Mit dieser relativ simplen Vorfilterung (und dem Einsatz des Delphi-
Inline-Assemblers) zhlt das Programm auf einer 1 GHz-Dual-Prozessor-
Maschine 409963 Lsungen in knapp 25 Minuten. 


Das sind schon mal nicht mehrere Stunden, stimmen muss es aber auch noch...


Andreas Zapf, April 2003
