文章目录
题目描述
平面上有N条直线,其中第 i 条直线是y = Ai * x+ Bi。
请计算这些直线将平面分成了几个部分。
输入描述
输出描述
一个整数代表答案。
输入输出样例
输入:
3
1 1
2 2
3 3
输出:
6
最终代码c/c++
#include<bits/stdc++.h>
using namespace std;
const int N = 1005;
double A[N], B[N];
int main()
{
int n; cin>>n;
pair<double, double> p;
set<pair<double, double>> s; //利用set自动去重功能筛选掉重边
for(int i = 0; i < n; i++)
{
cin >> p.first >> p.second ;
s.insert(p);
}
int i = 0; //将去重后的直线数据放回A,B数组
set<pair<double, double> >::iterator it = s.begin();
while(it != s.end()){
A[i] = it -> first; //是斜率
B[i] = it -> second; //是截距
it++, i++;
}
long long ans = 2; //初始情况当只有一条直线时,有两个平面
for(int i = 1; i < s.size(); i++)
{ //从下标1开始,也就是第二条直线
set<pair< double, double> > pos; //记录第i条直线与先前的交点
for(int j = 0; j <= i-1; j++)
{
double a1 = A[i], b1 = B[i];
double a2 = A[j], b2 = B[j];
if(a1 == a2) continue; //平行线无交点,跳出
//y=a1*x+b1, y=a2*x+b2 两条直线的交点:
p.first = (b2-b1)/(a1-a2); //交点的x坐标
p.second = a1*(b2-b1)/(a1-a2) + b1; //交点的y坐标
pos.insert(p);
}
ans += pos.size() + 1; //与先前直线的交点数+1
}
printf("%d
", ans);
return 0;
}
过程理解
总结
写到这里也结束了,在文章最后放上一个小小的福利,以下为小编自己在学习过程中整理出的一个关于 java开发 的学习思路及方向。从事互联网开发,最主要的是要学好技术,而学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯,更加需要准确的学习方向达到有效的学习效果。
由于内容较多就只放上一个大概的大纲,需要更及详细的学习思维导图的 点击我的Gitee获取。
还有 高级java全套视频教程 java进阶架构师 视频+资料+代码+面试题!
全方面的java进阶实践技术资料,并且还有技术大牛一起讨论交流解决问题。