比赛时的一个题,当时没有过,今天一检查竟然是qsort写错了一个数字~~~我那个悔死了,就差那么一点,实际其实就是一个简单的暴力。
代码如下:
#include <iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
int d_cmp(const void *_a,const void *_b)
{
double *a=(double *)_a;
double *b=(double *)_b;
return *a>*b?1:-1; //当时写成return *a>*b?1:0;,还觉得写得挺对的,哎~
}
int cct;
double x[10000],y[10000],save[100000];
int main()
{
// freopen("sample.txt","r",stdin);
int num;
double a,b;
while(scanf("%d",&num)!=EOF)
{
cct=0;
int count=0;
int flagk;
int flagg;
int fct=0;
for(int i=0; i<num; i++)
{
scanf("%lf%lf",&a,&b);
if(fct!=0)
{
flagg=0;
for(int j=0; j<fct; j++)
if(fabs(a-x[j])<1e-8&&fabs(b-y[j])<1e-8)
{
flagg=1;
break;
}
if(flagg==0)
{
x[fct]=a;
y[fct]=b;
fct++;
}
}
else
{
x[0]=a;
y[0]=b;
fct++;
}
}
num=fct;
flagk=0;
for(int i=0; i<num; i++)
for(int j=i+1; j<num; j++)
{
double k;
if(fabs(x[j]-x[i])<1e-12)
{
flagk=1;
}
else
{
k=(y[j]-y[i])/(x[j]-x[i]);
save[cct++]=k;
}
}
qsort(save,cct,sizeof(save[0]),d_cmp);
for(int i=0; i<cct; i++)
if(i>0)
{
if(fabs(save[i]-save[i-1])<1e-12)
continue;
else
count++;
}
else
count++;
if(flagk==1)
count++;
printf("%d\n",count);
}
return 0;
}