davidbejenariu2

Problema 3.5

Nov 26th, 2020 (edited)
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.57 KB | None | 0 0
  1. Precizare: Am modificat acest pastebin pe data de 26.11.2020 la ora 18:50 (înainte ca orice alt coleg să posteze vreo soluție alternativă) deoarece soluția precedentă nu trata corect anumite cazuri.
  2.  
  3. Idee de rezolvare:
  4.  
  5. Pentru a putea închide prima fereastră vom avea nevoie să închidem ferestrele care o acoperă, iar pentru a închide acele ferestre va trebui să închidem ferestrele care le acoperă la rândul lor șamd. Astfel, pentru a determina câte ferestre împiedică închiderea primei ferestre vom considera un graf orientat în care fiecare nod reprezintă o fereastră. Pe măsură ce citim coordonatele unei ferestre, verificăm dacă se intersectează cu cele anterior citite (verificăm dacă măcar un colț al unei ferestre se găsește în interiorul celeilalte sau invers) și dacă da, adăugăm un arc de la nodul precedent către cel abia citit. După citire, nodul x va duce către toate nodurile corespunzătoare ferestrelor ce trebuie închise exact cu un pas înainte de a închide fereastra x. În continuare, plecăm de la nodul 1 și „simulăm” închiderea ferestrelor printr-o parcurgere DFS recursivă cu condiția suplimentară că nodul adiacent lui x nu a fost închis încă (se poate verifica ușor folosind un vector caracteristic). Când un nod t nu mai are vecini sau toți vecinii acestuia au fost „închiși”, închidem și fereastra t și tot așa până ajungem la fereastra 1. De fiecare dată când închidem o fereastră incrementăm o variabilă (inițial egală cu 0), care va fi rezultatul final și pe care o vom afișa.
  6.  
  7. Pseudocod:
  8.  
  9. intersect(fereastră X, fereastră Y):
  10. dacă măcar un colț al ferestrei X se găsește în interiorul ferestrei Y:
  11. returnăm 1
  12. dacă măcar un colț al ferestrei Y se găsește în interiorul ferestrei X:
  13. returnăm 1
  14. returnăm 0
  15.  
  16. close(x):
  17. pentru fiecare y din lista lui x:
  18. dacă y nu a fost închis încă
  19. apelăm close(y)
  20. închidem fereastra y
  21. incrementăm numărul de ferestre închise
  22.  
  23. Do():
  24. citim n - numărul de ferestre
  25. pentru i de la 1 la n:
  26. citim pentru fiecare fereastră colțul stânga-jos și dreapta-sus
  27. generăm și celelalte 2 colțuri ale ferestrei
  28. pentru j de la i-1 la 1:
  29. dacă fereastra i se intersectează cu fereastra j:
  30. adăugăm în lista de adiacență a lui j pe nodul i
  31. apelăm închiderea ferestrei 1 prin funcția close(1)
  32. afișăm numărul de ferestre închise
  33.  
  34. Implementare C++: https://pastebin.com/x39rBTZQ
  35.  
  36. Complexitate timp: O(n^2)
  37.  
  38. Exemplele sunt cele date deja în enunțul problemei: https://pastebin.com/dewnan3G.
Advertisement
Add Comment
Please, Sign In to add comment