brodovi, zadatak iz programiranja

Upload: spaceerx

Post on 07-Jan-2016

15 views

Category:

Documents


0 download

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