- 在平面上添加一条线L(此线不与已有的线重合),线L与已有的线产生M给交点
- 新增平面数目=M+1
- 所以我们这道题:要判断每添加一条线,新增的交点数目;要判断添加一条线是否与以有的线重合
- 没有添加直线时,本来就有一个平面
#include"bits/stdc++.h"
using namespace std;
set<pair<double,double> >line;//用set存储直线
long long ans=1;//一共有多少平面数
int component(double a1,double b1){//判断交点数目
set<pair<double,double> >point;//用set集合判断点,**注意set对点有去重功能额
for(set<pair<double,double> >::iterator i=line.begin();i!=line.end();i++){
double a=(*i).first,b=(*i).second;
if(a==a1)continue;
else{
double x = (b1-b)/(a-a1);
double y = a1*x+b1;
pair<double,double> po(x,y);
point.insert(po);
}
}
return point.size();
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++){
int L=line.size();//用于下面判断
double a,b;
cin>>a>>b;
pair<double,double> m(a,b);
line.insert(m);
if(L!=line.size()){//如果添加了这条直线,这条直线与之前重合,set会自动去重,line长度不变
ans++;
ans+=component(a,b);
}
}
cout<<ans;
}
注意:
- set有去重功能
- 如果不用set,直接的对double进行判断是否相同,那么要注意double判断相等不能直接用if(a==b)