Informatika gyűjtemény

Egy szinttel feljebb Megoldás

2004050607080910

NézetNyomtat

Algoritmus

A falak "szigetek" az aknatengerben, ezek lesznek a gráf csúcsai. Teljes gráfot csinálunk, súlyozott élekkel. Az élek súlya a falszakaszok közötti távolság (tehát a legrövidebb létrahossz, amivel áthidalható a két "sziget" közötti űr. Ezen a gráfon egy speciális távolságfogalom értelmezhető: két pont közötti úton a leghosszabb él hossza. Ezt kell minimalizálnunk, a megfelelő út megkeresésével. Ez Dijkstra-algoritmus, egyszerű módosítással.

Távolság függvény

Ez volt a nehezebb rész. Sok esetet kell vizsgálni. Két szakasz távolságát kell kiszámolni, ahol a két szakasz vagy párhuzamos, vagy merőleges.
Ha merőlegesek:
Nézzük az egyik szakaszt, ennek végpontjaiban állítsunk merőlegest egyenesére, így a síkot 3 sávra bontottuk. Minden sávban három esetet vizsgálunk, aszerint, hogy a másik szakasz az első "alatt", "felett", vagy vele "metsző" helyzetben van.
Párhuzamos esetben kicsit egyszerűbb a helyzet.
Peregi szabály :) NEM HASZNÁLUNK VERSENYEN LEBEGŐPONTOS ARITMETIKÁT. Mivel a távolságokat nem kell összegezni, dolgozhatunk a távolságok négyzetével, tehát hosszú egészekkel.

Módosított Dijkstra-algoritmus

Indiana_dijkstra(G)

 minden v csúcsra: létra[v] := végtelen; 
 létra[indiana] := 0
 Q := G
 Ciklus amíg nemüres( Q )
    u := kivesz_min(Q)
    Ciklus u minden v szomszédjára
        l2 = max(létra[u], táv(u, v))
        Ha l2 < létra[v] akkor létra[v] := l2
    Ciklus vége
 Ciklus vége

Kódok

Peregi Tamás, (pascal): pt_indiana.pas
Mezei Tamás, (C#): mt_indiana.cs