#include #include #include using namespace std; #define NPOINT_MAX 10 #define DEPTH_MAX 13 #define FACTOR 0.68 class Point { public: double x, y; double sqdist( double px, double py ) { return (px-x)*(px-x) + (py-y)*(py-y); } }; int ncircle; Point C[NPOINT_MAX]; bool overlapped( double x, double X, double y, double Y ) { for ( int i = 0; i < ncircle; i++ ) { const double cx = C[i].x, cy = C[i].y; if ( cx <= x-1 || cx >= X+1 ) continue; if ( cy <= y-1 || cy >= Y+1 ) continue; if ( x <= cx && cx <= X || y <= cy && cy <= Y ) return true; if ( C[i].sqdist(x,y) < 1 ) return true; if ( C[i].sqdist(X, y) < 1 ) return true; if ( C[i].sqdist(x, Y) < 1 ) return true; if ( C[i].sqdist(X, Y) < 1 ) return true; } return false; } bool involved( double x, double X, double y, double Y ) { for ( int i = 0; i < ncircle; i++ ) { if ( C[i].sqdist(x, y) > 1 ) continue; if ( C[i].sqdist(X, y) > 1 ) continue; if ( C[i].sqdist(x, Y) > 1 ) continue; if ( C[i].sqdist(X, Y) > 1 ) continue; return true; } return false; } double compute( double x, double X, double y, double Y, int depth ) { if ( !overlapped(x, X, y, Y) ) return 0.0; // 十分小さいので入っていることにする. FACTOR の微調整が必要. if ( depth == DEPTH_MAX ) return (X-x)*(Y-y)*FACTOR; // 完全に入っている場合. if ( involved(x, X, y, Y) ) return (X-x)*(Y-y); double result = 0.0; result += compute(x, (X+x)/2, y, (Y+y)/2, depth+1); result += compute(x, (X+x)/2, (Y+y)/2, Y, depth+1); result += compute((X+x)/2, X, y, (Y+y)/2, depth+1); result += compute((X+x)/2, X, (Y+y)/2, Y, depth+1); return result; } int main() { ifstream cin("circle2.txt"); while ( cin >> ncircle, ncircle ) { for ( int i = 0; i < ncircle; i++ ) cin >> C[i].x >> C[i].y; printf("%.2lf\n", compute(0.0, 10.0, 0.0, 10.0, 0)); } return 0; }