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]; } }
相当長いので多分気合を入れればまだまだ短縮出来るでしょう。