brodovi, zadatak iz programiranja
DESCRIPTION
Brodovi, zadatak iz programiranja je zadatak sa BHOI takmicenja 2015.TRANSCRIPT
-
Brodovi (brodovi)
Va prijatelj, koji je nedavno nauio programirati, je napravio igru koja je vrlo slina poznatoj
Battleship igri. Igra se na matrici koja ima tano N redova i M kolona i svaki element
predstavlja kvadratid istih dimenzija. Na poetku igre, program koji je va prijatelj napisao
bira jedan horizontalni brod irine W koji zapravo predstavlja crticu dimenzija 1 x W i stavlja
ga na plou bez rotacije (uvijek je horizontalan), tako da su sve delije broda uzastopne i ne
prelaze granice matrice (tj. niti jedan dio broda ne moe biti van ploe). Vi naravno ne znate
gdje je brod tano postavljen i to morate da pogodite.
Zadatak i dodatna objanjenja
Na poetku svakog pogaanja se poziva funkcija koju vi implementirate:
void Napadaj(int N, int M, int W);
Znaenje parametara N, M i W je opisano u tekstu iznad. Za pogaanje vam je dao na
raspolaganje funkciju:
int Probaj(int x, int y);
Koju pozivate s koordinatama (x, y) koje su cijeli brojevi iz segmenata [1, N] i [1, M]
respektivno. Cilj vam je da u to manje poziva ove funkcije otkrijete gdje se tano brod
nalazi. Nakon svakog vaeg poziva, ta funkcija de vam vratiti jedan od brojeva iz sljededeg
skupa {-1, 1, 0}, a njihova znaenja su sljededa:
-1 -> funkcija nije pozvana s ispravnim parametrima, ali poziv se ipak broji kao pokuaj;
1 -> na deliji s koordinatama (x, y) se nalazi jedan dio broda;
0 -> na deliji s koordinatama (x, y) se ne nalazi dio broda.
Va cilj je da pozivanjem funkcije Probaj pronaete itav brod. Nakon to ta funkcija vrati za
tano W razliitih vrijednosti koordinata (x, y) rezultat 1, smatrat de se da ste brod pronali i
vaa funkcija Napadaj bi trebala da se zavri nakon toga. Kako ne bi bilo isuvie lagano
pronadi brod, program je iskoristio to da vi u svakom trenutku znate samo rezultate svakog
prethodnog poziva funkcije Probaj, pa u cilju povedavanja potrebnog broja pokuaja za
pronalazak broad, moe uraditi sljedede:
Ako postoji nova pozicija na koju se brod moe postaviti legalno, tj. horizontalno, bez da
prelazi granice matrice i da je svaki rezultat svih prethodnih poziva funkcije Probaj opet
validan (npr. ako je reeno da se dio broda nalazi u deliji (1, 2), a ne nalazi na (1, 1), to mora
biti zadovoljeno i novom pozicijom), onda program moe izabrati da u bilo kojem trenutku
igre premjesti brod na tu poziciju kako bi vam oteao pogaanje.
Naravno, uz dovoljno mnogo pokuaja dete mu ovu mogudnost oduzeti, jer funkcija Probaj
vam nikada nede vratiti laan rezultat. Takoer, smatrajte da je program vrlo pametan, te de
-
uvijek na optimalan nain premijetati brod. Optimalan nain znai da je broj potrebnih
poziva funkcije Probaj za pronalazak broda uvijek maksimiziran.
Bodovanje i ogranienja
Zadatak de biti testiran na pet podzadatka, od kojih svaki nosi odreeni broj bodova i ima
sljededa ogranienja:
Podzadatak 1 (10 bodova): N = 1 i 3