题解:SP3184 LINES - Game of Lines

· · 题解

题意中译中

给定 n 个点,这几个点两两连线,问其中存在多少条线两两不平行。

思路

两两不平行本质上就是斜率不同,所以只要计算斜率即可。

特别的,如果两个点的横坐标相同,我们可以直接设定其连线的斜率为正无穷(对的,浮点数标准里有正无穷),但是一定要写,否则这个计算结果也可能是负无穷,就会错误。

set 统计不同的数目显然非常方便。

代码

#include<bits/stdc++.h>
using namespace std;
constexpr int maxn=207;
int main()
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    pair<int,int>v[maxn];
    set<double>st;
    int n;
    while(cin>>n)
    {
        if(n==0)break;
        for(int i=1;i<=n;i++)
        cin>>v[i].first>>v[i].second;
        st.clear();
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<i;j++)
            {
                if(v[i].first==v[j].first)
                st.insert(+INFINITY);
                else st.insert((double)(v[i].second-v[j].second)/(v[i].first-v[j].first));
            }
        }
        cout<<st.size()<<'\n';
    }
    return 0;
}