该题是一道我不会的题目,这里把它拿出来分享给大家!!!!!!!!!!!!!!!!!!
在题解中我找到的,我们需要找规律来做这道题,下面给出思路:
解题思路:
我们知道没有直线的时候,平面只有一个
当有一条直线的时候,平面被分成两部分
当有两条直线的时候,这时有三种情况:平行,重合,相交
平行的话平面分成三部分(没有不同的交点)
重合的话平面分成两部分(无意义的一步)
相交的话平面分成四部分(有一个不同的交点)
当有三条直线的时候,新加入的直线和之前的两条直线也有三种情况:平行 重合 相交
平行的话平面在之前基础上划分平面数量加1(没有交点)
重合(无意义,等于啥也没干)
相交的话
如果和两者都于相交一个点(之前基础基础上分成部分数量加1+1)
如果和两者相交不同的两个点(之前基础基础上分成部分数量加1+2)在这里我们可以找到规律了,每次新加入的线段如果和之前的线段有n个不同的交点,就在原来的基础上多分出n+1个平面
#include<iostream>
#include<cstring>
#include<set>
using namespace std;
set<pair<long double,long double> > se;//交点
const int N = 1005;
long double A[N];
long double B[N];
set<pair<long double,long double> > s;//所有不重复的直线
set<pair<long double,long double> >::iterator it;
int main()
{
int n,i,j,x,y;
cin>>n;
for(i=0;i<n;i++)
{
cin>>x>>y;
s.insert(make_pair(x,y));//去掉重复的直线
}
n = s.size();
for(i=0,it=s.begin();it!=s.end();it++,i++)
{
A[i]=(*it).first;
B[i]=(*it).second; //将对应的横坐标x值存到A数组
} //将对应的纵坐标y值存到B数组内
long long ans=2;
set<pair<long double,long double> > se;
for(i=1;i<n;i++)
{
for(j=i-1;j>=0;j--)
{
//先判断是否平行,因为之前已经去重,所以直接判断斜率是否相等就行
if(A[i]==A[j])
continue;
long double x=(B[j]-B[i])/(A[i]-A[j]); //利用数学知识计算交点的横、纵坐标
long double y=(A[j]*B[i]-A[i]*B[j])/(A[j]-A[i]);
se.insert(make_pair(x,y));
}
int n2=se.size(); //得到交点数
ans+=(n2+1);
se.clear(); //重置
}
cout<<ans<<endl;
}
以上代码出自第十一届蓝桥杯省赛第二场真题(python组)——平面切分_SimbaAXin的博客-CSDN博客_python 平面分割
做题的一个思路也可以是“找规律”!!!!!!!!!!!!!!!!!!!!!!!!!!!!