0
点赞
收藏
分享

微信扫一扫

蓝桥杯之平面切分(几何问题)

猫er聆听没落的旋律 2022-04-02 阅读 73
几何学

平面上有 NN 条直线,其中第 ii 条直线是 y = A_i \times x + B_iy=Ai​×x+Bi​。

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

输入描述

第一行包含一个整数 NN。

以下 NN 行,每行包含两个整数 A_i, B_iAi​,Bi​。

其中,1 \leq N \leq 1000, −10^5 \leq A_i,B_i \leq 10^51≤N≤1000,−105≤Ai​,Bi​≤105。

输出描述

一个整数代表答案。

输入输出样例

示例

3
1 1
2 2
3 3

6

新增平面个数 = 直线与之前所有直线交点个数+1; 

用set容器去重

比较好的题解   :::https://blog.csdn.net/weixin_46266058/article/details/123441487

ACCODE:

#include <iostream>
#include <algorithm>
#include <set>
#include <cstring>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
#define N 500
typedef pair<int,int> PII;
typedef pair<double,double> PDD;
int n;
int A[1010],B[1010];
int main(){
	cin>>n;
	set<PII>st;
	for(int i=0,a,b;i<n;i++){
		cin>>a>>b;
		st.insert(PII(a,b));
	}
	int cnt=0;
	for(auto p:st)A[cnt]=p.first,B[cnt++]=p.second;
	int ans=2;
	for(int i=1;i<st.size();i++){//必须记录下来
		set<PDD>dian;
		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;
			dian.insert(PDD((b2-b1)*1.0/(a1-a2),((a1*b2-a2*b1)*1.0/(a1-a2))));
		}
		ans+=dian.size()+1;
	}
	cout<<ans;
}

举报

相关推荐

0 条评论