S. 42.
Fábián András 12. osztály
Szeged, Radnóti Miklós Kísérleti Gimnázium
e-mail: ***

A program Ubuntu 8.04 operációs rendszeren készült, Free Pascal 2.2.0-ás fordítóval fordítható.
A hat elemet minden elforgatott állapotában konstansként tároljuk. Így nem kell futtatás közben forgatni, ami gyorsabb futást eredményez. Egy elem egy elforgatott állapota 9 bájtból áll: 0.: az elem szélessége, 1-4.: az adott pozícióban az elem magassága, 5-8.: az adott pozícióban az elem alsó határa a bal alsó sarokhoz viszonyítva. (Mivel bájton tároljuk, az 5-8. értékeket 2-vel növeltem, így nem fordulnak elő negatív számok.)
Indításkor bekérjük a "start <W>" üzenetet. Ezt nem ellenőrizzük, mivel mindenképpen ezt az üzenetet kell kapnunk. (Feltéve, hogy nem hibás a bemenet...)
Ezt követően elindítjuk a végtelen ciklust. (Főleg a kényelmesebb tesztelés érdekében két új parancsot vezettem be: "exit" - kilépés, "magassag" - a torony magasságának kiírása.)
Az "item" parancs esetén meghívjuk a 'legalacsonyabb' nevű eljárást. Ez a megadott elem minden elforgatottját, ezen belül minden lehetséges pozíciót megvizsgál, ezek közül azt választja ki, ahol a legkisebb értéket ad egy képlet: "(x+1)*(magasság^2+1)*(elzártcellák+1)", ahol az x egy az összefüggő szabad területek átlagos méretétől függő érték. (Erre az x-re azért van szükség, hogy minél nagyobb összefüggő helyet biztosítsunk az érkező elemeknek.) Végül az eljárás módosítja az adott pozíciók magasságát a kapott eredménynek megfelelően, és értéket ad a pozíciót és az irányt tartalmazó változóknak.
Az így kapott értékeket kiírjuk, majd hogy nagyon nagy esetekre is csökkentsük a túlcsordulás veszélyét, a magasságértékeket lecsökkentjük. (Mivel mindig csak azokra a sorokra van szükségünk, amelyekben van szabad cella.)

Megjegyzés: Nyílvánvalóan nem a legjobb stratégia, viszont nincs olyan megoldás, ami bármilyen bemenet esetén a legalacsonyabb tornyot adná.
