sicily 1004之线段判断

来源:互联网 发布:汉字译拼音软件 编辑:程序博客网 时间:2024/05/21 16:58

因为今天中午,不知道为何,sicily服务器挂了,登不上去,ping后发现ip不通,不管它,等他能上了,我再交代码吧

题目是1004,可以百度一下sicily1004,有些博客会黏贴sicily的题目。

这道题是判断线段是否重叠的题目,题目会输入x1, y1, x2, y2,分别是改线段两个端点的坐标。因为线段是直线的一部分,所以最开始我是直接利用这两个坐标算出y=kx+b中的k和b,想着只要k和b一样,那就是重叠了。结果提交上去,WA超多次,我都郁闷了。今天早上才意识到,这是线段,不是直线,既然是线段,就会有端点,那么这道题就要想办法根据这输入的两个点的坐标,设计一个结构来使得接下来的排序啊和判断是否重叠更好的进行。待续,未完,代码就不改了,毕竟还没AC。

答案如下,仅供参考

#include<iostream>#include<algorithm>#include<vector>using namespace std;#defineINF 1e+15#define EPS 1e-7inline int dcmp(double a, double b){if ((a - b) < -EPS) return -1;if ((a - b) > EPS) return 1;return 0;}struct Line{double k, b;double pstart, pend;Line(double x1, double y1, double x2, double y2){if (dcmp(x1, x2) == 0){k = INF;b = x1;pstart = min(y1, y2);pend = max(y1, y2);}else{k = (y2 - y1) / (x2 - x1);b = y1 - k * x1;pstart = min(x1, x2);pend = max(x1, x2);}}};bool comp(Line a, Line b){if (dcmp(a.k, b.k) != 0) return dcmp(a.k, b.k) < 0;if (dcmp(a.b, b.b) != 0) return dcmp(a.b, b.b) < 0;if (dcmp(a.pstart, b.pstart) != 0)return dcmp(a.pstart, b.pstart) < 0;if (dcmp(a.pend, b.pend) != 0)return dcmp(a.pend, b.pend) < 0;return false;}vector<Line> line;int n;int ans(){sort(line.begin(), line.end(), comp);int re = n;double maxreached = line[0].pend;for (int i = 1; i < n; i++){if (dcmp(line[i].k, line[i - 1].k) == 0 && dcmp(line[i].b, line[i - 1].b) == 0){if (dcmp(line[i].pstart, maxreached) <= 0) re--;maxreached = max(maxreached, line[i].pend);}else{maxreached = line[i].pend;}}return re;}int main(){double x1, x2, y1, y2;while (cin >> n && n != 0){for (int i = 0; i < n; i++){cin >> x1 >> y1 >> x2 >> y2;line.push_back(Line(x1, y1, x2, y2));}cout << ans() << endl;line.clear();}//system("pause");return 0;}


0 0
原创粉丝点击