Lui Vasilică îi place foarte mult să facă baloane de săpun. Împreună cu prietena lui, Vasilică, petrece mult timp amestecând diverse tipuri de săpun și obținând tot felul de soluții ingenioase, pentru ca baloanele să fie cât mai frumoase și colorate. Dar, cum orice bucurie durează puțin, aceste baloane la un moment dat se sparg. Cei doi s-au gândit că ar fi interesant să știe când se întâmplă asta. Ca să afle, ei s-au hotărât să simuleze pe calculator ce se întâmplă cu baloanele într-un interval de timp. Dar pentru asta au nevoie de puțin ajutor la programarea unei astfel de simulări.
Cerința problemei
Într-o cameră sunt n baloane de săpun.
Pentru a putea delimita camera într-un reper cartezian, se dau locațiile pe axe ale pereților. Pereții sunt paraleli cu planele de coordonate, astfel că distanțele până la origine se pot măsura pe cele trei axe:
adică cei doi pereți paraleli cu YOZ se află la distanțele wx1, respectiv wx2, cei doi pereți paraleli cu XOZ se află la distanțele wy1, respectiv wy2 și cei doi pereți paraleli cu XOY se află la distanțele wz1, respectiv wz2, față de origine.
Indicii x,y,z reprezintă axele (OX, OY, respectiv OZ) pe care se măsoară distanța față de origine. Nu e obligatoriu ca wx1 < wx2, wy1 < wy2 și wz1 < wz2. În plus, se consideră întotdeauna primele două numere ca fiind distanțele măsurate pe OX, următoarele două pe OY, și ultimele două pe OZ. De exemplu:
1) 400 600 0 700 700 800 este același lucru cu
2) 600 400 0 700 800 700, dar nu este același lucru cu
3) 0 700 700 800 400 600
În primele două cazuri camera va fi aceeași având:
lungimea = |wx1 – wx2| = 200 cm
înălțimea = |wy1 – wy2| = 700 cm
lățimea = |wz1 – wz2| = 100 cm,
în timp ce în cazul al treilea,
lungimea = |wx1 – wx2| = 700 cm
înălțimea = |wy1 – wy2| = 100 cm
lățimea = |wz1 – wz2| = 200 cm
Fiecare balon de săpun este dat prin poziția centrului său (la momentul inițial): x,y,z, prin raza sa, r, și prin viteza (constanta) pe care o are, v , (mai exact componentele vitezei pe cele trei axe: vx, vy,vz). Se consideră că toate distanțele se măsoară în cm, respectiv pentru viteze, cm/s. Când un balon întâlnește un perete, el se sparge. Când se întâlnesc două sau mai multe baloane, toate baloanele implicate în coliziune se sparg.
Cazuri posibile de ciocnire
Se consideră două baloane, având razele r1, respectiv r2 și pozițiile la momentul t: (x1, y1, z1), respectiv (x2, y2, z2) . La momentul t+1, pozițiile sunt notate cu (x’1, y’1, z’1), respectiv (x’2, y’2, z’2). Vectorii viteză sunt dați de v1 = (vx1,vy1,vz1) și v2 = (vx2,vy2,vz2). Notăm cu d distanța între centrele baloanelor.
Cele două baloane se ciocnesc în momentul t+1, în oricare dintre următoarele cazuri, indiferent dacă este posibil ca, în intervalul (t, t+1), ele să nu fi trecut simultan prin același loc, și nici să se fi atins (orice condiție de mai jos se aproximează drept ciocnire):
La momentul t+1, d <=
+
.
Baloanele s-au depășit (întâlnit) în intervalul (t, t+1), dar în momentul t+1, d >
+
. Aici se disting două subcazuri:
1. Traiectoriile baloanelor sunt paralele și distanța dintre traiectorii este <=
+
.
2. Traiectoriile baloanelor sunt neparalele (inclusiv necoplanare) și distanța dintre traiectorii este <=
+
.
În orice altă situație, considerăm că baloanele nu se ciocnesc.
Pentru a ști dacă două baloane s-au depășit într-un interval de o secundă, se rețin relațiile dintre pozițiile lor la momentele t și t+1. Dacă există cel puțin o axă pe care relația între coordonate s-a inversat, atunci baloanele s-au depășit. Exemplu:
La momentul t:
x1 < x2, y1 < y2, z1 < z2.
La momentul t+1:
x’1 > x’2, y’1 < y’2, z’1 < z’2.
Notă! – Distanța dintre două drepte din spațiu se măsoară pe dreapta perpendiculară pe cele două drepte.
Se cere să se scrie un program care simulează mișcarea baloanelor în cameră. Simularea se va face începand cu momentul t0 = 0 până la, cel mult, tmax, dat. Dacă nu mai sunt baloane, simularea se oprește, chiar dacă tmax nu a expirat. Timpul va fi dat în secunde, și se va analiza starea sistemului din secundă în secundă. Se va afișa această stare, de fiecare dată când dispare cel puțin un balon.
Se recomandă următorul algoritm:
verificarea existenței a cel putin un balon în cameră + verificarea dacă la momentul t=0 nu există baloane care se ating între ele sau de pereți
ieșirea din program, în cazul în care nu există baloane în cameră, sau pornirea simulării cu numărul de baloane existente în cameră
cât timp nu a expirat tmax se repetă pașii:
verificarea ciocnirilor cu pereții, și marcarea baloanelor implicate pentru a fi șterse
verificarea ciocnirilor a două sau mai multe baloane, și marcarea acestora pentru ștergere (ciocnirile începând cu momentul t=1, implică și verificarea traiectoriilor, ca mai sus)
ștergerea baloanelor marcate
afișarea rezultatelor, dacă este cazul (dacă a fost șters cel puțin un balon)
avansarea pozițiilor (în funcție de viteze) și timpului cu o unitate
Atenție! – Simularea unei secunde NU înseamnă că porțiunea de program corespunzatoare trebuie să se execute într-o secundă! Timpul real de execuție al programului va fi intotdeauna mult mai mic decat tmax. O secundă este simulată printr-o iterație. Instrucțiunile corespunzatoare unei iterații se vor executa în mult mai puțin de o secundă.
Formatul datelor de intrare
Pe prima linie sunt date coordonatele pereților (numere reale), pe a doua linie, timpul maxim de simulare (întreg pozitiv), pe a treia linie, numărul inițial de baloane, n (întreg pozitiv), și pe fiecare dintre următoarele n linii, coordonatele centrului, raza și viteza balonului (numere reale):
n
………………………………………
Pentru numere reale se va folosi tipul double.
tmax < 0 sau n < 0.
Se considera vitezele nenule. Pentru fiecare viteză, cel puțin o axă va avea valoare nenulă.
În cazul în care coordonatele centrului unui balon nu se află în interiorul camerei, balonul nu va fi luat în considerare la simulare. Simularea se va face pentru cele n’ baloane (n’ = n – nr_baloane_în_afara_camerei – nr_baloane_sparte_la_momentul_0).
Formatul datelor de ieșire
Pe prima linie se va scrie numărul de baloane cu care se începe simularea, n’ . Pentru fiecare moment când dispare cel puțin un balon, se va scrie o secvență de tipul: momentul de timp, număr de baloane rămase,pozițiile baloanelor rămase. În cazul în care nu a expirat tmax, și au dispărut toate baloanele, ultimul moment afișat, trebuie să fie cel în care s-au spart ultimele baloane (tf). Dacă baloanele se sparg în intervalul (t, t+1], momentul de timp care se afișeaza va fi t+1. Exemplu:
…
…
…
…
Dacă nu există baloane cu care să se înceapa simularea se va afișa 0.
Output-ul trebuie să se termine întotdeauna cu sfârșit de linie (\n).
Autor: Anca Bălănel
Data: 16.11.2008