试题 历届试题 平面切分【第十一届】【省赛】【B组】 (找规律)

67 阅读2分钟

 

 该题是一道我不会的题目,这里把它拿出来分享给大家!!!!!!!!!!!!!!!!!!

在题解中我找到的,我们需要找规律来做这道题,下面给出思路:

解题思路:
我们知道没有直线的时候,平面只有一个
当有一条直线的时候,平面被分成两部分
当有两条直线的时候,这时有三种情况:平行,重合,相交
平行的话平面分成三部分(没有不同的交点)
重合的话平面分成两部分(无意义的一步)
相交的话平面分成四部分(有一个不同的交点)
当有三条直线的时候,新加入的直线和之前的两条直线也有三种情况:平行 重合 相交
平行的话平面在之前基础上划分平面数量加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 平面分割

做题的一个思路也可以是“找规律”!!!!!!!!!!!!!!!!!!!!!!!!!!!!