“Rama” si solutia problemei
Vasilica se joaca adesea pe telefonul mobil, jocul lui preferat fiind „Rama”. De curand, el a reusit sa implementeze acest joc in limbajul de programare studiat la scoala, numai ca in programul realizat de el rama trebuie sa depaseasca mai multe obstacole. El vrea ca sa-si verifice programul, asa ca va roaga sa il ajutati. Jocul se desfasoara pe o tabla dreptunghiulara de dimensiune n x m, pe care sunt plasate mancare si obstacole. Rama poate pleca din orice punct de pe aceasta tabla, deplasandu-se pe una din directiile 242c21c N, S, V, E, iar lungimea ei marindu-se cu o unitate de fiecare data cand ajunge la mancare. Rama va fi ghidata sa ajunga la mancare, prin deplasarea pe cele patru directii. Jocul se termina atunci cand rama ajunge pe o pozitie in care este plasat un obstacol sau este pe o pozitie exterioara tablei, terminat de mancat toata hrana sau s-a ciocnit de ea insasi. Vasilica doreste sa afle lungimea ramei, coordonatele capului si coordonatele cozii la sfarsitul jocului.
Fiind date dimensiunile tablei dreptunghiulare n si m, coordonatele initiale ale ramei, numarul de obstacole, numarul de pozitii cu hrana, coordonatele obstacolelor, directia de deplasare pentru fiecare pozitie cu mancare precum si numarul de deplasari pentru a ajunge din pozitia curenta la mancare, sa se determine lungimea ramei, coordonatele capului si coordonatele cozii la sfarsitul jocului.
Fisierul de intrare rama.in contine pe prima linie, separate printr-un spatiu dimensiunile tablei n si respectiv m.
Pe a doua linie se afla separate printr-un spatiu coordonatele initiale ale ramei, adica pozitia initiala de unde pleaca aceasta.
Pe a treia linie se afla un numar o, reprezentand numarul de obstacole de pe tabla, iar pe urmatoarele o linii coordonatele obstacolelor, separate prin cate un spatiu.
In continuare, se citeste un numar k reprezentand numarul de pozitii cu mancare.
Pe urmatoarele k linii se citesc, separate prin cate un spatiu, 2 numere naturale reprezentand directia de deplasare si respectiv distanta catre pozitia pe care se afla mancarea.
Directiile sunt codificate prin: 1- N, 2-S, 3-V, 4-E.
Fisierul rama.out contine pe prima linie lungimea finala a ramei.
Pe linia a doua se vor scrie coordonatele capului ramei, separate printr-un spatiu.
Pe cea de-a treia linie se vor scrie coordonatele cozii ramei, separate printr-un spatiu.
0 < n < 50, 0 < m < 50, 0 < o < 40
Exemplu
rama.in |
Rama.out |
Explicatie |
|
|
Dimensiunea tablei este de 5x6 Obstacolele se afla in punctele de coordonate (3,6), (4,2), (4,4) si sunt marcate cu X. Rama se afla in patratul marcat cu Patratele in care se afla mancarea sunt marcate cu M. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
M |
|
|
M |
|
|
|
|
M |
|
M |
|
X |
|
|
X |
|
X |
|
|
|
M |
|
|
|
|
M |
program rama;
type matrice=array[1..50, 1..50] of longint;
var
procedure MutareDirectie (d:longint; var p:longint);
begin
end;
begin
else if (dir=2) then x:=v[p].x+k
else if(dir=3) then y:=v[p].y-k
else if (dir=4) then y:=v[p].y +k;
if (a[x,y] = -1) or (x>n) or (y>m) then
begin
ok:=1; writeln(g, 'Lungimea ', l);
writeln(g, 'Coada ramei ', v[p-l+1].x,' , ', v[p-l+1].y);
writeln(g, 'Capul ramei ', v[p].x,' , ', v[p].y);
end else begin
l:= l+1; for j:=1 to k do
begin MutareDirectie(dir, p);
end; end; end;
close(f);
if (ok=0) then begin
writeln(g, 'Lungimea ', l);
writeln(g, 'Coada ramei ', v[p-l+1].x,' , ', v[p-l+1].y);
writeln(g, 'Capul ramei ', v[p].x,' , ', v[p].y);
end; close(g); end.
|