平面切分(c++详解)
一种是第i条直线与第x条直线相交的交点是第x条直线与其它几条直线已有的交点重叠+1(平面上有 N 条直线,其中第 i 条直线是 y=Ai×x+Bi。其中,1≤N≤1000,−10^5≤Ai,Bi≤10^5。一种是第i条直线与第x条直线相交产生新的交点平面+1(一种是第i条直线与前面的直线重复,此时不增加平面。一种是第i条直线与第x条直线平行,只增加1个平面。以下 N 行,每行包含两个整数A
·
题目描述
平面上有 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;
}
更多推荐
所有评论(0)