有n个恐怖分子在站在一个平面上,每个恐怖分子都有一个位置坐标位置(x,y)。现在有一个激光武器要用来消灭这些恐怖分子,这个武器所在的位置是(x0,y0),激光武器每发射一次,就可以消灭一条直线上的所有恐怖分子。
现在,你的任务是计算最少要动用多少次激光武器,才可以消灭所有的恐怖分子。
Input第一行是3个整数N和x0,y0,分别表示恐怖分子的数量和武器所在的位置。(1<=n<=1000,-10000<=x0,y0<=1000)
接下来N行,每行两个整数表示每个恐怖分子的坐标位置Xi和Yi,恐怖分子可能站在相同的位置,但是不可能站在武器的位置上。(-10000<=Xi,Yi<=10000)
Output输出最少需要使用激光武器的次数。
Sample Input样例输入1:
4 0 0
1 1
2 2
2 0
-1 -1
样例输入2:
2 1 2
1 1
1 0
样例输出1:
2
样例输出2:
1
Hint样例1和样例2的情况如图所示:
利用斜率求解,并将其保存为double型(精度高),
#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
int n,i;
int x[1001],y[1001];
double tan[1001];
while(scanf("%d %d %d",&n,&x[0],&y[0])!=EOF)
{
int z = 0;
int flag[1001] = {0};
for (i=1;i<=n;i++)
scanf("%d %d",&x[i],&y[i]);
for (i=1;i<=n;i++)
{
if (x[i]-x[0]==0)
tan[i] = 1e9;//可以理解为斜率无穷大
else
tan[i] = (double)(y[i]-y[0])/(double)(x[i]-x[0]);
}
sort(tan+1,tan+n+1);
for (i=1;i<=n;i++)
{
if (tan[i]!=tan[i+1])
flag[i] = 1;
if (flag[i])
z++;
}
printf("%d\n",z);
}
return 0;
}