https://www.acwing.com/problem/content/4312/
要点就是斜率相同时可以被一束激光打到
而斜率有可能在轴上,计算斜率可能导致分母为0,于是采用pair对的形式去存储而不是直接计算
存储为pair对后再映射除以最大公约数,相当于约分,用set自动去重就可以知道有多少种约分方式
有多少种就说明有多少斜率不同的点
#include<iostream>
#include<set>
using namespace std;
const int N = 1010;
typedef pair<int,int>PII;
int x0,y0;
int gcd(int a, int b)
{
return b ? gcd(b,a%b) : a;
}
int main()
{
set<PII>S;
int n;
cin >> n >> x0 >> y0;
while(n--)
{
int x,y;
cin >> x >> y;
x-=x0,y-=y0; //把所有坐标映射到以x0,y0为原点的坐标系上
int d=gcd(x,y); //求最大公约数
x/=d,y/=d; //映射坐标到公共点上,有多少个公共点就有多少个斜率相同的点
S.insert({x,y});
}
cout << S.size() << endl;
}