fork download
  1. program chasing; (* ho risolto pensando a un riferimento cartesiano centrato nel punto dove si trova la palla. Il tdog indica il tempo che il cane impiega per allinearsi alla palla sull'asse x se dir è R o L oppure sull'asse y se dir è U o D, durante questo tempo la palla si sposta con la sua velocità nella direzione dir e quindi trovo spostpall e di conseguenza la nuovacoord della palla dopo lo spostamento. In base alla nuova posizione della palla rispetto al cane si valuta se il cane deve muoversi verso la palla con velocità positiva o negativa e quindi si calcola la velocità relativa Ds+/-Bs. Dopo vari tentativi con valori e posizioni diverse ho capito in quali casi le distanze andavano prese in valore assoluto e quando invece serviva tenerle con il loro segno*)
  2. Uses Math;
  3.  
  4. var
  5. Bs, Bx, By, Ds, Dx, Dy, T, dist : Longint;
  6. dir : Char;
  7. tdog,spostpall,nuovacoordpall : real;
  8. begin
  9.  
  10.  
  11.  
  12. ReadLn(Dx, Dy, Ds);
  13.  
  14. ReadLn(Bx, By, Bs);
  15.  
  16. ReadLn(dir);
  17.  
  18. T := 0;
  19. if dir='R' then
  20. begin
  21. dist:=(Dx-Bx);
  22. tdog:=abs(Dy-By)/Ds;
  23. spostpall:=Bs*tdog;
  24. nuovacoordpall:=Bx+spostpall;
  25. if nuovacoordpall<=Dx then Ds:=-Ds
  26. else if Ds<=Bs then begin writeln(-1); exit; end;
  27. T:=ceil(tdog+(abs(dist-spostpall))/(abs(Ds-Bs)));
  28. end;
  29. if dir='L' then
  30. begin
  31. BS:=-Bs;
  32. dist:=(Dx-Bx);
  33. tdog:=abs(Dy-By)/Ds;
  34. spostpall:=Bs*tdog;
  35. nuovacoordpall:=Bx+spostpall;
  36. if nuovacoordpall<=Dx then begin if Ds<=abs(Bs) then begin writeln(-1); exit; end
  37. else Ds:=-Ds;
  38. end;
  39.  
  40. T:=ceil(tdog+(abs(dist-spostpall))/(abs(Ds-Bs)));
  41. end;
  42. if dir='D' then
  43. begin
  44. BS:=-Bs;
  45. dist:=abs(Dy-By);
  46. tdog:=(abs(Dx-Bx)/Ds);
  47. spostpall:=Bs*tdog;
  48. nuovacoordpall:=By+spostpall;
  49. if nuovacoordpall<Dy then begin if Ds<=abs(Bs) then begin writeln(-1); exit; end
  50. else Ds:=-Ds;
  51. end;
  52.  
  53. T:=ceil(tdog+ (abs(dist-spostpall))/(abs(Ds-Bs)));
  54. end;
  55. if dir='U' then
  56. begin
  57. dist:=abs(Dy-By);
  58. tdog:=abs(Dx-Bx)/Ds;
  59. spostpall:=Bs*tdog;
  60. nuovacoordpall:=By+spostpall;
  61. if nuovacoordpall<=Dy then Ds:=-Ds
  62. else if Ds<=Bs then begin writeln(-1); exit; end;
  63. T:= ceil(tdog+(abs(dist-spostpall))/(abs(Ds-Bs)));
  64. end;
  65.  
  66. writeln(T);
  67. end.
Success #stdin #stdout 0.01s 5260KB
stdin
-107 457 2
1 -1 1
R
stdout
566