davidbejenariu2

Cod C++

Nov 26th, 2020
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.95 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #define N 10001
  4.  
  5. using namespace std;
  6.  
  7. struct point
  8. {
  9.     int x, y;
  10. };
  11.  
  12. struct window
  13. {
  14.     point A, B, C, D;
  15. };
  16.  
  17. int n;
  18. window w[N];
  19.  
  20. vector <int> G[N];
  21. int closings;
  22. bool closed[N];
  23.  
  24. inline bool inwindow( point X, window Y ) /// punctul X este in interiorul dreptunghiului Y
  25. {
  26.     return X.x >= Y.A.x && X.x <= Y.B.x && X.y >= Y.A.y && X.y <= Y.D.y;
  27. }
  28.  
  29. bool intersect( window X, window Y )
  30. {
  31.     /// X are macar un colt in Y
  32.  
  33.     if ( inwindow( X.A, Y ) || inwindow( X.B, Y ) || inwindow( X.C, Y ) || inwindow( X.D, Y ) )
  34.         return 1;
  35.  
  36.     /// Y are macar un colt in X
  37.  
  38.     if ( inwindow( Y.A, X ) || inwindow( Y.B, X ) || inwindow( Y.C, X ) || inwindow( Y.D, X ) )
  39.         return 1;
  40.  
  41.     return 0;
  42. }
  43.  
  44. void close( int node ) /// programul simuleaza recursiv inchiderea ferestrelor
  45. {
  46.     int i;
  47.  
  48.     for ( i = 0; i < G[node].size(); ++i ) /// parcurgem toti vecinii ferestrei node
  49.         if ( !closed[G[node][i]] ) /// daca nu am inchis inca fereastra G[node][i]
  50.             close(G[node][i]); /// continuam prin a-i parcurge vecinii
  51.  
  52.     closed[node] = 1; /// dupa ce am parcurs toti vecinii putem inchide fereastra node
  53.     ++closings; /// incrementam numarul de ferestre inchise
  54. }
  55.  
  56. void Do()
  57. {
  58.     int i, j;
  59.  
  60.     cin >> n;
  61.  
  62.     for ( i = 1; i <= n; ++i )
  63.     {
  64.         cin >> w[i].A.x >> w[i].A.y >> w[i].C.x >> w[i].C.y;
  65.  
  66.         /// generam si celelalte 2 colturi ale ferestrei
  67.  
  68.         w[i].B.x = w[i].C.x; w[i].B.y = w[i].A.y;
  69.         w[i].D.x = w[i].A.x; w[i].D.y = w[i].C.y;
  70.  
  71.         for ( j = i - 1; j >= 1; --j )
  72.             if ( intersect( w[j], w[i] ) ) /// daca 2 ferestre se intersecteaza
  73.                 G[j].push_back(i);         /// adaugam adiacenta in graf
  74.     }
  75.  
  76.     close(1); /// apelam inchiderea primei ferestre
  77.  
  78.     cout << closings; /// afisam numarul minim de ferestre inchise
  79. }
  80.  
  81. int main()
  82. {
  83.     Do();
  84.  
  85.     return 0;
  86. }
Advertisement
Add Comment
Please, Sign In to add comment