题目大意:
战场上有n个突击队员,一个枪,战场是一个带有笛卡尔坐标的平面,给出枪的坐标及n个突击队员的坐标,枪一次可以射击贯穿枪的坐标的任一条直线,问要把所有的突击队员全部消灭掉,最少需要射击多少次。
思路分析:
把枪的坐标当做坐标原点,枪每次射击一条直线,那这道题最终也就是求所有的突击队员能连成多少穿过原点的直线,也就是看有多少不同的直线,那也就是看有多少不同的斜率,那么每次读取一个突击队员的坐标,求得这个点和原点构成的直线的斜率,把每次不同的斜率存下来,最后有多少不同的斜率,也就是要射击多少次。
要注意垂直于x轴和垂直于y轴的直线的斜率,以及这个点处于原点的情况。
代码实现:
#include<stdio.h>
#include<string.h>
#include<math.h>
const int maxn=1010;
const double eps=1e-10;
double k[maxn];
int dcmp(double x) {
if(fabs(x)<eps) return 0;
else return -1;
}
int main(){
int n;
double x0,y0;
while(~scanf("%d%lf%lf",&n,&x0,&y0)){
memset(k,0,sizeof(k));
int cnt=0,cnt1=0,cnt2=0,sum=0,flag;
double x,y;
for(int i=0;i<n;i++){
scanf("%lf%lf",&x,&y);
x-=x0,y-=y0;
flag=0;
if(x==0&&y==0){
cnt1=1;
continue;
}
if(x==0){
cnt1=1;
continue;
}
if(y==0){
cnt2=1;
continue;
}
double kk=y/x;
for(int i=0;i<cnt;i++){
int ans=dcmp(kk-k[i]);
if(ans==0){
flag=1;
break;
}
}
if(flag==1) continue;
k[cnt++]=kk;
}
sum+=(cnt+cnt1+cnt2);
printf("%d\n",sum);
}
}