Ülesanne SOE-KÜLM

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.

Teek

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, Y
Java
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) -> R
Java
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.

Teegi kasutamine

Oma lahenduse oma arvutis selle teegiga testimiseks tuleb:

  1. Kaasata teek oma programmi:
    C/C++: failid: Second.h ja Second.o; kasutamine: #include "Second.h"
    Python: fail: Second.pyc; kasutamine: from Second import *
    Java: fail: Second.class
  2. Panna sisendi kirjeldus faili input.txt. Faili esimesel real peavad olema kuus tühikutega eraldatud täisarvu N, M, X1, Y1, X2, Y2, kus N ja M on toa mõõdud ning (X1,Y1) esimese mängija algasukoha ja (X2,Y2) märgitud ruudu koordinaadid.
  3. Programmi töö lõppedes tekib väljundfail output.txt, milles on kõigi lahenduse tehtud käikude kirjeldus ja viimasel real mängu tulemus:
    Ok, kui lahenduse vastus oli õige,
    Wrong Answer, kui vastus ei olnud õige,
    Presentation Error, kui lahendus rikkus teegi kasutamise reegleid.

Kompileerimisel ja testimisel peavad lahenduse lähtetekst, teegi failid ja input.txt olema samas kataloogis. Lahendus ei või ise otse faile avada.

Hindamine

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.

Teegid

C/C++
GCC jaoks kompileeritud tgz (Linux, 64-bitine x86)
lähtetekst ise kompileerimiseks tgz, zip
Python
Python 2.6.8 jaoks kompileeritud tgz
lähtetekst ise kompileerimiseks tgz, zip
Java
JRE 1.5+ jaoks kompileeritud tgz
lähtetekst ise kompileerimiseks tgz, zip

Testid

Linux
tgz
Windows
zip