解析见代码:
//zt,ping mian qiefeng 平面切分
#include<iostream>
#include<cmath>
#define max_size 1010
using namespace std;
int ans=1;//没有直线时有一个平面
double jd[max_size][2];//交点可能含小数,故用float型
void f(int i,int arr[1010][2],int a,int b)
{
int temp=0;//统计当前直线与在它之前直线的不同交点数
for(int j=1;j<i;j++)
{
if(arr[j][0]==a)
{
if(arr[j][1]==b) return;//当加入直线与之前直线相同时,不会多出来平面
else continue;//两直线平行无交点
}
else
{
jd[temp][0]=(b-arr[j][1])*1.0/(arr[j][0]-a);//求交点x值
jd[temp][1]=a*1.0*jd[temp][0]+b;//求交点y值
int flag=1;
for(int k=0;k<temp;k++)
{
if(abs(jd[k][0]-jd[temp][0])<1e-6&&abs(jd[k][1]-jd[temp][1])<1e-6)//与之前交点相同,不做统计 浮点型有精度误差,判断差足够小即可
{
flag=0;
break;
}
}
if(flag==1)
{
temp++;
}
}
}
ans=ans+temp+1;//当前平面数=未加此直线的平面数+加入此直线时多出来的平面数 而多出来的平面数等于该直线与之前直线的不同交点数+1
}
int main()
{
int num;
cin>>num;
int arr[1010][2];
for(int i=1;i<=num;i++)
{
cin>>arr[i][0]>>arr[i][1];
f(i,arr,arr[i][0],arr[i][1]);//边加入直线边计算
}
cout<<ans;
return 0;
}