0
点赞
收藏
分享

微信扫一扫

平面问题:平面分割 平面切分

菜头粿子园 2022-03-25 阅读 85
蓝桥杯c++


前言

对于平面问题,最重要的就是 找对规律!!

上题目

1.平面分割

 原题链接

2.平面切分


平面切分原题链接。

一、解题

1.平面分割

规律分析:

每多1个交点,平面数+1

先放直线,每条直线 最多与之前的每条直线有1个交点

再放圆,每个圆最多与之前的每个圆有2个交点,并与20条直线有20*2个交点

最后把交点数相加即可

#include <iostream>
using namespace std;
int main()
{
  // 请在此输入您的代码
  int i,sum=0;
  for(i=3,sum=4;i<=20;i++)sum+=i;//先放直线
  for(i=1;i<=20;i++){//再放圆
    sum+=(20*2);//每一个圆和20条直线的最多交点数
    sum+=((i-1)*2);//每一个圆和2前面圆的最多交点数
  }
  cout<<sum;
  return 0;
}

2.平面切分

其实规律与上面的题类似,只是现在算的不是最多的情况

要考虑重合的情况

每条直线对平面的贡献数最低是1,也就是平行,没有交点,只多了一个平面。

若有交点,再加上本条直线与前(i-1)条直线不重复的交点数

举个例子

 所以,一定一定要记得直线去重,不然算出的答案会多,呜呜

#include <bits/stdc++.h>
using namespace std;
int main()
{
  // 请在此输入您的代码
int n,i,j,cnt=1,count=0,p;
double x2[1009],y2[1009];
cin>>n;
int k[n],b[n];
for(i=0;i<n;i++){
  cin>>k[i]>>b[i];
 //for(j=0;j<i;j++)if(k[i]==k[j]&&b[i]==b[j]){i--;n--;}这样也可以去重
}



for(i=0;i<n;i++){//筛查每一条直线k[i],b[i]
   count=0;//count记录交点个数
  
   for(j=0;j<i;j++){//判断每一条直线 与之前直线k[j],b[j]的交点
   
     if(k[i]==k[j]&&b[i]==b[j]){continue;}//去重
     else 
	 if(k[i]==k[j]&&b[i]!=b[j]){continue;}//平行
     
     else if(k[i]!=k[j]){//相交    k[i]!=k[j]&&b[i]!=b[j]
        count++;//下标从1起
        x2[count]=(b[j]-b[i])*1.0/(k[i]-k[j])*1.0;
        y2[count]=k[i]* x2[count]+b[i];
       
        for(p=1;p<count;p++)if(fabs(x2[count]-x2[p])<=1e-5&&fabs(y2[count]-y2[p])<=1e-5){count--;break;}//交点重合
        }
   // cout<<count<<endl;//
   }
  cnt+=(count+1);//
  //cout<<cnt<<endl;
}
cout<<cnt;
  return 0;
}

二、总结

题的难度不大,重要的是规律!!规律!!

 

 

举报

相关推荐

0 条评论