#include #include #include #include #include using namespace std; ifstream fin("rect.txt"); bool intersectrange( int m1, int M1, int m2, int M2 ) { if ( m2 <= M1 && m1 <= M2 ) return true; return false; } class Rectangle { public: int x1, y1; int x2, y2; bool intersect( const Rectangle &r ) const { if ( !intersectrange(x1, x2, r.x1, r.x2) ) return false; if ( !intersectrange(y1, y2, r.y1, r.y2) ) return false; return true; } }; #define NRECT_MAX 200 int nrect; Rectangle R[NRECT_MAX]; vector G[NRECT_MAX]; bool visited[NRECT_MAX]; void dfs( int n ) { visited[n] = true; for ( int i = 0; i < G[n].size(); i++ ) if ( !visited[G[n][i]] ) dfs(G[n][i]); } int main() { int ntest; fin >> ntest; for ( int nt = 0; nt < ntest; nt++ ) { fin >> nrect; for ( int i = 0; i < nrect; i++ ) fin >> R[i].x1 >> R[i].y1 >> R[i].x2 >> R[i].y2; for ( int i = 0; i < nrect; i++ ) assert(R[i].x1 <= R[i].x2 && R[i].y1 <= R[i].y2); for ( int i = 0; i < nrect; i++ ) G[i].clear(), visited[i] = false; for ( int i = 0; i < nrect; i++ ) for ( int j = i+1; j < nrect; j++ ) if ( R[i].intersect(R[j]) ) { G[i].push_back(j); G[j].push_back(i); } int ncolor = 0; for ( int i = 0; i < nrect; i++ ) if ( !visited[i] ) dfs(i), ncolor++; cout << ncolor << endl; } return 0; }