Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #define N 10001
- using namespace std;
- struct point
- {
- int x, y;
- };
- struct window
- {
- point A, B, C, D;
- };
- int n;
- window w[N];
- vector <int> G[N];
- int closings;
- bool closed[N];
- inline bool inwindow( point X, window Y ) /// punctul X este in interiorul dreptunghiului Y
- {
- return X.x >= Y.A.x && X.x <= Y.B.x && X.y >= Y.A.y && X.y <= Y.D.y;
- }
- bool intersect( window X, window Y )
- {
- /// X are macar un colt in Y
- if ( inwindow( X.A, Y ) || inwindow( X.B, Y ) || inwindow( X.C, Y ) || inwindow( X.D, Y ) )
- return 1;
- /// Y are macar un colt in X
- if ( inwindow( Y.A, X ) || inwindow( Y.B, X ) || inwindow( Y.C, X ) || inwindow( Y.D, X ) )
- return 1;
- return 0;
- }
- void close( int node ) /// programul simuleaza recursiv inchiderea ferestrelor
- {
- int i;
- for ( i = 0; i < G[node].size(); ++i ) /// parcurgem toti vecinii ferestrei node
- if ( !closed[G[node][i]] ) /// daca nu am inchis inca fereastra G[node][i]
- close(G[node][i]); /// continuam prin a-i parcurge vecinii
- closed[node] = 1; /// dupa ce am parcurs toti vecinii putem inchide fereastra node
- ++closings; /// incrementam numarul de ferestre inchise
- }
- void Do()
- {
- int i, j;
- cin >> n;
- for ( i = 1; i <= n; ++i )
- {
- cin >> w[i].A.x >> w[i].A.y >> w[i].C.x >> w[i].C.y;
- /// generam si celelalte 2 colturi ale ferestrei
- w[i].B.x = w[i].C.x; w[i].B.y = w[i].A.y;
- w[i].D.x = w[i].A.x; w[i].D.y = w[i].C.y;
- for ( j = i - 1; j >= 1; --j )
- if ( intersect( w[j], w[i] ) ) /// daca 2 ferestre se intersecteaza
- G[j].push_back(i); /// adaugam adiacenta in graf
- }
- close(1); /// apelam inchiderea primei ferestre
- cout << closings; /// afisam numarul minim de ferestre inchise
- }
- int main()
- {
- Do();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment