解题思路:
即如果新添加与前面直线无交点(平行),则增加一个平面。如果与前面的直线有不同的交点,平面数增加交点数+1个
注意事项:
直线重合以及直线平行的情况
参考代码:
#include <stdio.h>
#include <stdbool.h>
int a[1000]; //存放每条直线的斜率
int b[1000]; //存放常数项
double x[1000]; //x,y 存放交点坐标
double y[1000];
int main()
{
int i,j;
int n;
int sum=0; //平面分成了sum个部分
scanf("%d",&n); //直线的数量n
for(i=1;i<=n;i++)
{
scanf("%d%d",&a[i],&b[i]); //输入每条直线的两个系数 a,b
bool flag=false; //标记是否存在重合直线 false表示不重合
for(j=1;j<i;j++)
{
if(a[j]==a[i]&&b[j]==b[i]) //判断直线是否重合
{
flag=true;
break;
}
}
if(!flag) //如果与之前的直线不重合 找交点的个数
{
if(i==1) //第一条直线的情况 将平面分为2部分
{
sum=2;
}
else
{
for (j = 1; j < i; j++) //找与前面直线的交点
{
if (a[i] == a[j]) //如果平行 则没有交点 进行下一次循环
{
continue;
}
else
{
x[j] = 1.0 * (b[i] - b[j]) / (a[j] - a[i]); //求出交点坐标
y[j] = a[i] * x[j] + b[i];
flag = false; //标记是否有相同交点
for (int k = 1; k < j; k++) //判断是否有相同交点
{
if (x[j] == x[k] && y[j] == y[k])
{
flag = true;
break;
}
}
if (!flag) //交点不相同,sum++
{
sum++;
}
}
}
sum += 1; //不管有无交点,最后都加1
}
}
}
printf("%d",sum);
return 0;
}
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复