Von Jens Kunerle (Snej) eMail: 03342300948@t-online.de


Heute ist nun etwas mehr Zeit.
Danke fuer die Idee zu diesem Wettbewerb.
Er hat mir viel Spass gemacht.
Weiter so.

Leider wurde zum Schluss die Zeit knapp, und ich konnte nur noch die
halbfertige Assemblerversion abschicken.
Irgendwo hatte ich ebx und edx verwechselt und nicht rechtzeitig gefunden.
Hier nun die Fertige (ausser Konkurrenz versteht sich - eine 
Siegerloesung ist es sowieso nicht [<999s auf PIII-450]), da mich die 
Laufzeitunterschiede zu den anderen Programmen auf ein und dem selben 
Rechner interessieren.
Es wurden nur Aenderungen eingefuegt die schon in der Liesmich angedeutet
wurden:

0. nur notwendige Register retten / initialisieren            [solve64 ]
1. 32BitVersion der Rekursion, wenn erstes Bit>=28            [solve32a]
2. bei Bit 33 muessen die langen Teile alle eingefuegt sein   [solve32b]
3. ein Test auf Rekursionsabbruch (abbruch64 bzw. abbruch32) macht alles nur
   langsamer :(
4. im c++-programm wurde perm=7 auf perm=6 geaendert (5s Gewinn)

Uebrigens reicht /S:7800000 bei den Linkerparametern 
Dateien: Nachtrag.txt p2.asm puzz2.exe


Hier noch mal Einiges zu den wichtigsten zwei Punkten meines Programms:

1. der zusaetzliche Symmetriehack:
  Es geht um Teil Nr5 und Nr9 auf dem ct Puzzle-Bild (Numerierung ab 1)
  Symmetrieteil ist 5
  man kann Paare erzeugen wie folgt: fuer eine Ansicht t1 von Teil5 
    spiegele t1 an der yz-Ebene -> t2
    drehe t2 um z-Achse (180 Grad) -> t3
    drehe t1 um z-Achse (180 Grad) -> t4
  Entweder ist (t1,t2) oder (t1,t3) vorhanden
  Man entscheidet sich nun bewusst fuer diejenige  der beiden 
  Paarkombinationen (t1,t2) bzw. (t3,T4) welche weiter hinten liegt
  Jetzt kann man fuer jede Ansicht von Teil9 waehlen ob man diese oder die
  an der yz-Ebene gespiegelte Version nimmt.
  (Teil5 und die anderen Teile gehen dann in ihre gespiegelte Lagen ueber
   und die Anzahl der Loesungen aendert sich nicht.)
  Werden die Teile mitprotokolliert muss man bei einer Loesung sehen ob
  Teil9 gespiegelt wurde. Wenn ja mus die gesamte Loesung nochmal 
  gespiegelt werden um eine richtige Loesung zu erhalten.(Kein Problem bei
  nur 410.000 Loesungen im Gegensatz zu 1.000.000.000 Legeoperationen)

2. wenn das freie Bit gefunden wurde und die moeglichen drei (bei 
  ungewoenlichen Permutationen auch mehr) Richtungen der Fortsetzung
  auf ihre Begehbarkeit ueberprueft wurden, werden Teile ausgeschlossen
  die nicht mehr legbar sind
  dazu wird zu jedem freien Bit und jedem verwendbaren Teilset die
  folgende Datenstruktur mit entsprechenden Pointern angelegt:

Teile die genau in         xyz x xy y yz z zx x  Richtung fortgesetzt werden
zugehoerige Pointer:
Dann wenn -   verbaut:     ------------------
Dann wenn x   verbaut:              ------
Dann wenn y   verbaut:                   ------
Dann wenn z   verbaut:         ------
Dann wenn xy  verbaut:                   -
Dann wenn xz  verbaut:              -
Dann wenn yz  verbaut:         -
Dann wenn xyz verbaut:
  
mit freundlichen Gruessen

Jens Kunerle (Snej)
