第九题:平面切分
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<limits.h>
int main()
{
int n,i,j,m,len,d,p,k;//整数N、循环变量(i、j、m、k)、交点数d、判断平行p
float y,x; //交点坐标
long long ans=2; //平面数;n最小为1,因此ans最小为2
scanf("%d",&n);
float dian[n][3]; //储存交点的数组,[n][0]存x,[n][1]存y,[n][2]存0、1 用于计算长度
int arr[n][2]; //arr存直线
for(i=0;i<n;i++)
{
scanf("%d",&arr[i][0]);
scanf("%d",&arr[i][1]);
}
for(i=0;i<n;i++) //循环直线
{
for(k=0;k<n;k++) //初始化交点数组
{
dian[k][2]=0;
}
for(p=0,d=0,j=0;j<i;) //与前面的直线一一判断,相交,平行,重合
{
if(arr[i][0]==arr[j][0]) //斜率是否相等
{
if(arr[i][1]==arr[j][1]) //截距是否相等
{
break;
}
else
{
p++; //记录是否平行
}
}
else
{
x=1.0*(arr[i][1]-arr[j][1])/(arr[j][0]-arr[i][0]);
y=1.0*arr[i][0]*x+arr[i][1];
for(len=0;dian[len][2]==1;) //计算与前面直线交点数
{
len++;
}
if(len==0)
{
goto B;
}
for(m=0;m<len;m++) //判断交点前面是否出现
{
if(x==dian[m][0]&&y==dian[m][1]) //出现跳出
{
goto A;
}
}
B:
d++; //没出现,存入,点数+1,长度+1
dian[len][0]=x;
dian[len][1]=y;
dian[len][2]=1.0;
}
A:
j++;
}
//printf("d:%d\n",d); 之前用于找错误
if(p!=0&&d==0) //如果没有交点,又平行则增加一个面
{
ans++;
}
if(d!=0) //如果有交点,则增加面数为:交点数+1
{
ans+=(d+1);
}
}
printf("%lld",ans);
return 0;
}