当前位置:   article > 正文

蓝桥杯-平面切分(欧拉定理)_平面上有 条直线,其中第 条直线是 。 请计算这些直线将平面分成了几个部分

平面上有 条直线,其中第 条直线是 。 请计算这些直线将平面分成了几个部分

资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
平面上有 条直线,其中第 条直线是 。

请计算这些直线将平面分成了几个部分。

输入格式
第一行包含一个整数 。

以下N行,每行包含两个整数 。

输出格式
一个整数代表答案。

样例输入
3
1 1
2 2
3 3
Data
样例输出
6
Data
评测用例规模与约定
对于 的评测用例,, 。

对于所有评测用例,, 。

****思路:****这个题是相当有意思,如果两条直线平行,多增加一条边,平面多增加一,如果相交,就再多增加一,用pos记录相交的点,就是额外增加的面,最后答案就是增加的边数加pos的数量,加上原始面1

#include<bits/stdc++.h>

using namespace std;

const int N=1005;

int main()
{
	
	int n;
	cin>>n;
	int a,b;
	long double A[N],B[N];
	
	pair<long double,long double> p;
	
	set<pair<long double,long double> > s;//利用set自动去重筛选掉重边
	
	for(int i=0;i<n;i++)
	{
		
		scanf("%d %d",&a,&b);
		p.first=a;
		p.second=b;
		s.insert(p);
		
	 } 
	
	int i=0;//讲去重后的数据重新放回A,B数组 
	for(set<pair<long double,long double> >::iterator it=s.begin();it!=s.end();it++,i++)
	{
		A[i]=it->first;
		B[i]=it->second;
	}
	long long ans=2;//初始情况只有一条直线时,有两个平面
	
	for(int i=1;i<s.size();i++)//从下标1开始,也就是第二条直线 
	{
		set<pair<long double,long double> > pos;//记录第i条直线与先前的交点
		for(int j=i-1;j>=0;j--)
		{
			int a1=A[i],b1=B[i];
			int a2=A[j],b2=B[j];
			if(a1==a2)//遇到平行线无交点,跳出
				continue;
			p.first=1.0*(b2-b1)/(a1-a2);//如果相交,求x坐标 
			p.second=1.0*a1*((b2-b1)/(a1-a2)) +b1;//相交后的y坐标 
			pos.insert(p);
		 } 
		
		ans+=pos.size()+1;//因为没有之前切分之前,就有 一个面 
	 } 
	
	printf("%d\n",ans);
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/48423
推荐阅读
相关标签
  

闽ICP备14008679号