AOJ0090

問題:Overlaps of Seals
半径1のシールが重なっている枚数の最大を求める問題.
接触している場合(中心どうしの距離が2)の場合も重なっているとみなす.
すなわち,最大枚数になっている領域は必ずいずれかの交点を含む.
すべての交点を求め,そこから半径1以内の円の中心をカウントすれば良い.
サンプルが貧弱すぎてやばい.+1e-15してなかったらWAになる.
交点座標はcomplex型で楽させてもらった.

#include<iostream>
#include<vector>
#include<complex>
#include<cstdio>
#include<cmath>
using namespace std;
complex<double> I(0,1);
int main()
{
	int n;
	while( cin >> n , n )
	{
		vector<complex<double> > in;
		for( int i=0; i<n; ++i )
		{
			double x,y;
			scanf("%lf,%lf",&x,&y);
			in.push_back( complex<double>(x,y) );
		}
		
		vector<complex<double> > cp;
		for( int i=0; i<n-1; ++i )
		{
			for( int j=i+1; j<n; ++j )
			{
				if( norm( in[i]-in[j] ) <= 4.0 )
				{
					complex<double> a( (in[i]-in[j])*0.5 );
					complex<double> b( a*I );
					b /= abs(b);
					b *= sqrt(1-norm(a));
					cp.push_back( in[j]+a+b );
					cp.push_back( in[j]+a-b );
				}
			}
		}
		int ans = 1;
		for( int i=0; i<cp.size(); ++i )
		{
			int a = 0;
			for( int j=0; j<n; ++j )
			{
				if ( norm( cp[i]-in[j] ) <= 1.0 + 1e-15 )
				{
					a++;
				}
			}
			ans = max( ans , a );
		}
		cout << ans << endl;
	}
	return 0;
}