Un robot se afla in originea axei Ox si nu se poate misca decat de-a
lungul acesteia, cu cate un metru la fiecare pas. Pe aceasta axa se
afla o gaura undeva la o coordonata intreaga X cuprinsa intre -10000
si 10000, diferita de 0. Dumneavoastra telecomandati acest robot si
vreti sa-l trantiti in gaura. Carburantul robotului este insa limitat
si el nu poate efectua decat 10*|X| miscari. Gasiti un algoritm care
sa se conformeze acestei restrictii.
Programul scris de dumneavoastra va trebui sa simuleze exact procesul
de cautare a gaurii desfasurat de robot. Pentru mai multa claritate,
sugeram un algoritm banal: Deplasam pe rand robotul in 1, -1, 2, -2,
3, -3, ... Acest algoritm efectueaza insa O(|X|^2) mutari.
Programul dumeavoastra va interactiona cu un modul "Robot" scris de
Onor. Comisie, pe care il veti include in sursa proprie cu comenzile:
uses Robot; { In Pascal }
sau
#include "robot.h" /* In C/C++ */
Acest modul va furnizeaza urmatoarele proceduri:
1. procedure Init;
respectiv
void Init(void)
Trebuie apelata NEAPARAT inaintea oricarei altei proceduri din modul.
2. procedure Left;
respectiv
void Left(void)
3. procedure Right;
respectiv
void Right(void)
Se apeleaza pentru a instiinta modulul ca doriti deplasarea
robotului cu un pas spre stanga/dreapta. Modulul se va ingriji singur
sa va omoare programul in momentul in care ati nimerit gaura sau ati
depasit numarul permis de mutari.
Insist pe cateva aspecte:
A) Nu aveti nevoie de nici un fel de citire de date, nici de vreo
tiparire pe ecran sau in fisier. Trebuie numai sa aveti grija sa
apelati procedura Init;
B) Nu stiti de la inceput *CATE* mutari aveti voie sa faceti la un
test anume, intrucat nu cunoasteti nici locatia X a gaurii :)
C) Pentru cei pasionati, sa stiti ca optinmul este de fapt 9*|X|
mutari. Am fost darnic :)
In incheiere, trimit un exemplu de modul al Comisiei (dar nu va
osteniti sa-l fentati ca n-o sa mearga ;) )
------------
unit Robot;
interface
procedure Init;
procedure Left;
procedure Right;
implementation
var Coord, NMoves, Hidden:Longint;
procedure AlesBules(S:String);
begin
WriteLn(S);
Halt; { Halt rulz! }
end;
procedure Init;
begin
Coord:=0;
NMoves:=0;
Randomize;
Hidden:=-10000+Random(20001);
WriteLn('Pentru stirea dumneavoastra, gaura este la ',Hidden);
end;
procedure Check;
begin
Inc(NMoves);
if NMoves>10*Abs(Hidden)
then AlesBules('**** Robotul se f^itz^iie prea mult!');
if Coord=Hidden
then AlesBules('**** Ati nimerit gaura-a-a-a-a-a!');
end;
procedure Left;
begin
Dec(Coord);
Check;
end;
procedure Right;
begin
Inc(Coord);
Check;
end;
end.
|
|