题目描述
在坐标纸上有N个不重合的点,两两可以连一个线段并延伸成直线,请问在这些直线里最多能选出多少条使得他们两两不平行也不重合。
输入描述:
第1行: 输入1个正整数:N
第2…N+1行:第i+1行是两个用空格隔开的整数,为点i的坐标(Xi,Yi)
输出描述:
输出1个整数,为最多的互不平行的直线数目。
示例1
输入
3
1 0
-2 0
0 0
输出
1
思路:就是把所有不同的斜率求出来,另外判断一下斜率为0 的情况
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+100;
using namespace std;
struct point
{
int x, y;
}p[maxn], pp;
int i, j, n;
map<double, int> XL;
int main()
{
cin >> n;
long long int ans = 0;
for (i = 1; i <= n; i++)
{
cin >> p[i].x >> p[i].y;
}
ans = 0;
for (i = 1; i <= n; i++)
{
for (j = i + 1; j <= n; j++)
{
pp.x = p[i].x - p[j].x;
pp.y = p[i].y - p[j].y;
if (pp.y == 0)
{
ans++;
}
else
{
XL[(double)pp.x / pp.y]++;
}
}
}
if (ans == 0)
{
cout <<XL.size()<< endl;
}
else
{
cout << XL.size() + 1 << endl;
}
}