题目描述

平面上有 N 条直线,其中第 i 条直线是 y=Ai​×x+Bi​。

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

输入描述

第一行包含一个整数 N。

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

其中,1≤N≤1000,−10^5≤Ai​,Bi​≤10^5。

输出描述

一个整数代表答案。

输入输出样例

示例

输入

3
1 1
2 2
3 3

 

输出

6

 

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

有四种情况:

一种是第i条直线与前面的直线重复,此时不增加平面

一种是第i条直线与第x条直线平行,只增加1个平面

一种是第i条直线与第x条直线相交产生新的交点平面+1(在整体+1的基础上,不知道整体+1看下面代码

一种是第i条直线与第x条直线相交的交点是第x条直线与其它几条直线已有的交点重叠+1(这个是整体+1

以下为代码

#include<bits/stdc++.h>
using namespace std;
double A[100005];
double B[100005];
double x[100005];
double y[100005];
int zll(int n){//进入该函数,寻找第n条直线与其他直线相交或平行的情况 
	int remark,num=1;//进入该函数至少加1,所以初始化为1 ,也是整体+1 
	for(int j=0;j<n;j++){
					if(A[n]==A[j]) continue;//第n条直线与前面j条平行,跳入下一次循环,因为平行只增加一个平面 
				remark=0;	              //若是第n条直线碰到第2条甚至更多平行的直线,不再增加新的平面 
			     x[j]=(B[n]-B[j])/(A[j]-A[n]);//执行到这里只剩下了两种情况,一种是第n条直线与第j条直线相交产生了新的交点 
			     y[j]=A[n]*x[n]+B[n];         //第二种是第n条直线与第j条直线相交,却交到了第j条与其它直线相交的旧交点上 
			     for(int k=0;k<j;k++){
			     	if(x[j]==x[k]&&y[j]==y[k]){
			     		remark=1;//这是第2种情况,不再+1 
					 }
				 }
				 if(remark!=1){
				 	num++;//不是第2种情况就是第1种情况,产生一个新交点我就再+1 
				 }
		        }
		        return num;
}
int main(){
	int n,mark=0,sum=1;
	cin>>n; 
	for(int i=0;i<n;i++){
		cin>>A[i]>>B[i];
		mark=0;
		for(int j=0;j<i;j++){
			if(A[i]==A[j]&&B[i]==B[j]){//遍历第i条线的前面i-1条是否重复 
				mark=1;
				break;
			}
		}
		if(mark==1)//只要找到重复的,直接跳到下一次循环 
			continue;//此时实际并没有产生新的平面 ,排除掉了唯一不增加平面的情况 
			if(i==0){
				sum=2;
			}
			else{//进入else内部每一次相加,zll()的值最少为1 
				sum=sum+zll(i);
			}
	}
		cout<<sum;
	return 0;
}

 

 

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐