Abgabe Programmierwettbewerb
  zu http://www.heise.de/ct/03/07/230/

Autor: Michael Pichler, 29. 4. 2003.
  mailto:michael.pichler@nurfuerspam.de
  http://www.8ung.at/mpichler/

Binaries (Linux):
  ctbox ... lt. Aufgabenstellung (Lsungsanzahl 409963)
  ctlogo ... Ausgabe der Lsung (mit Apostroph auf Teil 4)

Windows-binaries (und pentomino - yet another puzzle) knnen
  mit dem script make.sh erstellt werden (Windows: cygwin).
  Ursprngliche Entwicklung auf einem Gericom Webboy ;-)

Compileraufruf (*keine* CPU-spezifischen flags):
  g++ -Wall -O3 -fomit-frame-pointer
  (ohne assembler code, sollte mit jedem C++ compiler bersetzbar sein)

Laufzeiten (SuSE-Linux 8.0, g++ 2.95.3):
  P3/1133 MHz/512 KB Cache ... 1699 s
  P4/1.4 GHz/256 KB Cache ... 1495 s

Anmerkungen zum Algorithmus
  Als Basis diente der im Artikel vorgestellte Algorithmus mit folgenden nderungen:
- "echter" Permutationsalgorithmus (rekursiv) anstelle von used_parts flags
- pro Teil Positionen nach kleinstem gesetztem Bit geordnet (mit start_ Indizes):
  diese haben damit automatisch das nchste bit gesetzt und auch kein niedrigeres
  (damit Laufzeit des ursprnglichen lochwuerfel-Programmes auf 0.2 s reduziert!).
- Preprocessing rewritten (class Point3i::xform)
- Reihenfolge der Teile wie vorgegeben
- Symmetrie-Lock auf Teil 6 (weil es am kompaktesten und "wendigsten" erschien)
- Anordnung der bits: 12x + 3y + z (kurze Seiten zuerst fllen)
- marginale Verbesserung durch Permutation von Part* anstelle der Indizes und
  Weiterreichen des nbval (1LL << nextbit) in der Rekursion
- geringfgige Verbesserung durch Zhlen aller gleicher Positionen die durch das
  Platzieren von 4 aus 12 Teilen und Lsung des Problems fr die brigen 8 Teile
  (nicht fr die Ausgabe der Lsung in den ctlogo und pentomino binaries anwendbar)

Vermutete weitere Verbesserungsmglichkeiten (nach dem 1. Mai ;-)
- Effizientere Suche nach dem nchsten ungesetzten bit als mit while und <<
- CPU-spezifische compiler flags oder besserer compiler
- Auswahl des optimalen ungesetzten bits anstelle fix das nchste zu verwenden
  (Nachteil: Vorsortierung nach kleinstem gesetzten bit damit ungltig) oder
  bessere statische Anodnung (pos2bit_ derzeit unverwendet; cheating?)
- Andere Reihenfolge der Teile um Speichercaches besser zu nutzen (cheating?)
- Einsatz von Java anstelle von C++ :-)
