Középiskolai Matematikai és Fizikai Lapok
Informatika rovattal
Kiadja a MATFUND Alapítvány
Már regisztráltál?
Új vendég vagy?

Az I. 292. feladat (2012. április)

I. 292. Egy hatalmas tesztpályán egy robot mozgását kívánjuk vizsgálni a síkban. A robot mozgása a lehető legegyszerűbb, mert egy lépésben a koordináta-rendszer két tengelyének irányába tud elmozdulni. A robot a (0,0) pontból indul, és egy utasítássort hajt végre. Az utasítássor E, H, J és B betűkből áll. Ha a robot az (x,y) pontban van, akkor az E parancs az (x,y+1), a H parancs az (x,y-1), a J parancs az (x+1,y), illetve a B parancs az (x-1,y) pontba viszi át.

A tesztpályán ellenőrzési pontok vannak. A robot az ellenőrzési pontoktól való távolságok összegét minden lépése után feljegyzi. Távolságon a Manhattan-távolságot értjük a feladatban, amely az (x1,y1) és (x2,y2) pontok esetén |x1-x2|+|y1-y2|.

A program első parancssori argumentuma legyen egy adatállomány neve. A fájl első sorában N, az ellenőrzési pontok száma (1\le N\le 100\;000) és M, a robot utasításainak száma (1\le M\le 300\;000) van. Az ezt követő N sorban az ellenőrzési pontok x és y koordinátái (-1\;000\;000\le x,y\le +1\;000\;000) vannak szóközzel elválasztva. Az ellenőrző pontok között lehetnek olyanok, amelyeknek mindkét koordinátája megegyezik. A következő sorban M darab karakter (EH, JB) van, amely a robot utasítássorát jelenti.

A parancssor második argumentumaként megadott kimeneti állomány M sorban egy-egy egész számot, a robot által az addigi utasítások végrehajtása után feljegyzett távolság-összeget adja.

Például:

A feladat megoldási ideje 1 másodperc lehet. A tesztpálya mérete és a nagyszámú ellenőrzési pont miatt a hatékony futás érdekében megfelelő előkészítés után érdemes a távolságok összegét számolni.

Beküldendő a program forráskódja (i292.pas, i292.cpp, ...), valamint a program rövid dokumentációja (i292.txt, i292.pdf, ...), amely tartalmazza a megoldás rövid leírását, és megadja, hogy a forrásállomány melyik fejlesztő környezetben fordítható.

Adrian Satja Kurdija (COCI feladata) nyomán

(10 pont)

A beküldési határidő 2012. május 10-én LEJÁRT.


Megoldásokról:

A beküldött programok egy része minden robotlépés után az összes ellenőrzési pont távolságának összegét újraszámolta. Ezzel a módszerrel a futási idő legfeljebb 1-2000 ellenőrzési pontig és 1-2000 robotlépésig lesz 1 másodperc alatt. Ha az értékek ennél nagyobbak, akkor előfeldolgozást érdemes végezni. Ennek egy lehetséges módszerét Antal János Benjamin (Nyíregyháza, Széchenyi István Közgazdasági Szakközépiskola)12. osztályos tanuló adta meg:

Az adatok beolvasása után feltöltöm a függőleges és vízszintes tömböket. A függőleges tömb i. eleme először azt tartalmazza, hogy hány olyan pont van, amelynek y koordinátája pontosan i. A következő lépésben a függőleges tömb i-dik eleméhez hozzáadok az (i-1). elemet. Így a függőleges tömb azt fogja tárolni, hogy az y=i egyenesen és az alatt hány darab pont van. A vízszintes tömb hasonló lépéseken megy keresztül, csak az x koordinátával, és végül azt fogja tárolni a tömb i. eleme, hogy az x=i egyenesen és attól balra hány pont található. Ez azért fontos, mert a rács bármely részén áll a robot, egy tömbindexeléssel meg lehet mondani, hány pont van tőle balra/jobbra vagy felfelé/lefelé. Ezután megszámolom az összes ellenőrzőpont és a robot távolságát. Minden lépés után csak a következőket csinálom, akár E/H/J/B lépés volt, mindig megnézem a függőleges vagy vízszintes tömb segítségével, hogy a robot lépésének irányában hány pont van a robottól abban az irányban. Ezt a darabszámot kivonom az össztávolságból, mert mindegyik ponthoz 1 egységgel közelebb került. Utána ezt a darabszámot kivonom az N-ből, így megkapom hány ponttól távolodott pontosan 1 egységet. Ezt hozzáadom az össztávolsághoz, és meg is van a lépés utáni távolságok összege anélkül, hogy végig kellett volna számolni az összes pont távolságát.

Mintamegoldása: i292.pas

Tesztállományok: tesztallomanyok.zip


Statisztika:

12 dolgozat érkezett.
10 pontot kapott:Antal János Benjamin, Jákli Aida Karolina, Kucsma Levente István, Varga 256 Erik.
8 pontot kapott:1 versenyző.
7 pontot kapott:3 versenyző.
6 pontot kapott:2 versenyző.
5 pontot kapott:2 versenyző.

A KöMaL 2012. áprilisi informatika feladatai