Kaks venda armastavad koos kõikvõimalikke mänge mängida. Viimasel ajal meeldib neile mängida klassikalise mängu "soojem-külmem" uut varianti. Seda mängtakse tühjas toas, mille põrand on jagatud ühikruutudeks. Seega võib tuba vaadelda N rea ja M veeruga ristkülikukujulise tabelina. Igal ruudul on koordinaadid (x,y), kus x on ruudu rea- ja y veerunumber (read on nummerdatud ülalt alla 1..N ja veerud vasakult paremale 1..M).
Mängitakse kahekesi. Esimene mängija seisab mingile ruudule. Teine mängija seob esimese silmad kinni ja märgib mingi teise ruudu ristiga.
Edasi hakkab esimene mängija liikuma. Igal sammul võib ta astuda oma asukoharuudust selle naaberruutu üle nende ühise serva (toast välja minna muidugi ei või). Iga sammu järel ütleb teine mängija esimesele ühe sõna:
Esimese mängija eesmärk on jõuda märgitud ruudule võimalikult väikese arvu sammudega. Seejärel mäng lõpeb ja esimene mängija saab punkte vastavalt kulutatud sammude arvule. Kirjutada programm, mis aitab esimesel mängijal võimalikult väikese sammude arvuga märgitud ruudule jõuda.
Selleks on kasutada teek Second, mis emuleerib teise mängija käitumist. Teegis on järgmised funktsioonid:
Funktsioon | Kirjeldus |
---|---|
C/C++void Init(long *N, long *M, long *X, long *Y);Python Init() -> N, M, X, YJava int[] Second.Init() -> {N, M, X, Y} |
Seda funktsiooni tuleb kasutada üks kord enne kõiki teisi teegi funktsioone. Tagastab toa mõõdud, kus N on ridade ja M veergude arv, ja esimese mängija lähtekoha reanumbri X ja veerunumbri Y (1 ≤ X ≤ N ≤ 1000, 1 ≤ Y ≤ M ≤ 1000). |
C/C++long Move(long X, long Y);Python Move(X, Y) -> RJava int Second.Move(X, Y) |
Seda funktsiooni tuleb kasutada käikude tegemiseks. Selle funktsiooni väljakutse viib esimese mängija tema asukoharuudult ruutu (X,Y), mis peab olema mängija asukoharuudu naaber ja toa piirides. Funktsioon tagastab ühe järgmistest väärtustest: -1 vastab teise mängija sõnale "soe", 1 vastab teise mängija sõnale "külm", 0 vastab teise mängija sõnale "sama". |
C/C++void Finish();Python Finish()Java void Second.Finish() |
Seda funktsiooni tuleb kasutada üks kord mängu lõpetamiseks. Selle funktsiooni väljakutse lõpetab autmaatselt sinu programmi töö. Selle funktsiooni kasutamise ajal peab esimene mängija olema märgitud ruudul. Võib eeldada, et mändija algasukoht pole kunagi märgitud. |
Oma lahenduse oma arvutis selle teegiga testimiseks tuleb:
Kompileerimisel ja testimisel peavad lahenduse lähtetekst, teegi failid ja input.txt olema samas kataloogis. Lahendus ei või ise otse faile avada.
Lahendus, mis rikub teegi kasutamise reegleid, saab testi eest 0 punkti.
Lahendus, mis kasutab funktsiooni Finish, kui esimene mängija ei ole märgitud ruudul, saab testi eest 0 punkti.
Lahendus, mis teeb rohkem kui 106 käiku, saab testi eest 0 punkti.
Muidu saab lahendus P*A/S punkti, kus P on testi väärtus, S lahenduse käikude (funktsiooni Move väljakutsete) arv ja A=|X1-X2|+|Y1-Y2|.
input.txt | output.txt | Märkused |
---|---|---|
5 7 2 2 4 6 |
Init(N = 5, M = 7, X = 2, Y = 2) Move(X = 3, Y = 2) = -1 Move(X = 4, Y = 2) = -1 Move(X = 4, Y = 3) = -1 Move(X = 4, Y = 4) = -1 Move(X = 4, Y = 5) = -1 Move(X = 4, Y = 6) = -1 Finish() Ok |
S=6, A=6. Kui P=5, saab lahendus selle testi eest 5,00 punkti. |
3 2 3 1 3 2 |
Init(N = 3, M = 2, X = 3, Y = 1) Move(X = 2, Y = 1) = 1 Move(X = 2, Y = 2) = -1 Move(X = 3, Y = 2) = -1 Move(X = 2, Y = 2) = 1 Move(X = 3, Y = 2) = -1 Move(X = 2, Y = 2) = 1 Move(X = 3, Y = 2) = -1 Finish() Ok |
S=7, A=1. Kui P=5, saab lahendus selle testi eest 0,72 punkti. |