Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 11634 | Accepted: 4387 |
Description
Input
Output
Sample Input
5 1 1 4 2 2 3 3 1 1 -2.0 8 4 1 4 8 2 3 3 6 -2.0 3 0 0 1 1 1 0 2 1 2 0 3 1 0
Sample Output
Top sticks: 2, 4, 5. Top sticks: 1, 2, 3.
Hint
只要(c x b) * (d x b) <= 0 && (e x a) * (f x a) <= 0,就说明两线段相交
#include <cstdio> #include <cstring> #include <iostream> #include <cmath> using namespace std; struct line { double x1, y1, x2, y2; }e[100005]; int n; bool inter[100005]; bool Intersect(line a, line b) { double cxb = (a.x2 - b.x1) * (b.y2 - b.y1) - (a.y2 - b.y1) * (b.x2 - b.x1); double dxb = (a.x1 - b.x1) * (b.y2 - b.y1) - (b.x2 - b.x1) * (a.y1 - b.y1); double exa = (b.x1 - a.x1) * (a.y2 - a.y1) - (b.y1 - a.y1) * (a.x2 - a.x1); double fxa = (b.x2 - a.x1) * (a.y2 - a.y1) - (a.x2 - a.x1) * (b.y2 - a.y1); if ((fabs(cxb * dxb) < 1e-10 || cxb * dxb < 0) && (fabs(exa * fxa) < 1e-10 || exa * fxa < 0)) { return true; } return false; } int main() { while (~scanf("%d", &n) && n) { memset(inter, false, sizeof(inter)); for (int i = 0; i < n; i++) { scanf("%lf%lf%lf%lf", &e[i].x1, &e[i].y1, &e[i].x2, &e[i].y2); } int cou = 0; for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { if (Intersect(e[i], e[j])) { inter[i] = true; cou++; break; } } } cou = n - cou; printf("Top sticks: "); for (int i = 0, c = 0; i < n; i++) { if (!inter[i]) { c++; if (c == cou) { printf("%d.\n", i + 1); break; } else { printf("%d, ", i + 1); } } } } return 0; }