2002でレッツゴー(2)

さてと次はC言語に直しましょう。


まず、複素数を普通に2要素の配列として扱うようにします。
そのため複素数の演算を自力で書きます。

ついでに大量の短縮も取り入れます。
この辺は単純に力技です。

#define t(x,y,k)c=s[a]+(f x g)/2,d=s[a+1]+(g y f)/2,k bsearch(&c,s,n,4,p)
p(int*p,int*q){return *p-*q;}
m;
short s[2006],a,b,f,g,c[2];
main(n){
	for(;scanf("%d",&n),n;printf("%d\n",m/2))
	{
		for(a=m=b=0;b<n*2;++b)
			scanf("%d",s+b);
		for(qsort(s,n,4,p);a<n*2;a+=2)
			for(b=a;(b+=2)<n*2;f+~g&1?t(-,+,)?t(+,-,m+=!!):0:0)
				f=s[b]-s[a],g=s[b+1]-s[a+1];
	}
}

相当長いので多分気合を入れればまだまだ短縮出来るでしょう。