Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 8862 | Accepted: 3262 |
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
Source
#include "cstdio" #include "cmath" #include "vector" #include "iostream" using namespace std; const double eps = 1e-8; double max(double a,double b){ return a>b?a:b; } double min(double a,double b){ return a<b?a:b; } int cmp(double x){ if(fabs(x)<eps) return 0; if(x>0) return 1; return -1; } inline double sqr(double x){ return x*x; } struct point{ //点结构体 double x,y; point(){} point (double a,double b):x(a),y(b) {} //重载 void input(){ scanf("%lf%lf",&x,&y); } friend point operator + (const point a,const point b){ return point(a.x+b.x,a.y+b.y); } friend point operator - (const point a,const point b){ return point(a.x-b.x,a.y-b.y); } }; double det(const point &a,const point &b){ //向量a与向量b的叉积 return a.x*b.y-a.y*b.x; } struct line{ //线结构体 point a,b; line(){} line(point x,point y):a(x),b(y){} }; bool line_make_point_one(line a,line b){ //判断两线段是否相交,完美代码! return max(a.a.x,a.b.x) >= min(b.a.x,b.b.x) && //前四行判断两向量所形成的矩形是否相交,排除两线段在同一条直线但不相交的可能 max(b.a.x,b.b.x) >= min(a.a.x,a.b.x) && max(a.a.y,a.b.y) >= min(b.a.y,b.b.y) && max(b.a.y,b.b.y) >= min(a.a.y,a.b.y) && cmp(det(a.a-b.b,b.a-b.b))*cmp(det(a.b-b.b,b.a-b.b))<=0 && //判断两线段是否相交 cmp(det(b.a-a.a,a.b-a.a))*cmp(det(b.b-a.a,a.b-a.a))<=0; } int main(){ int n; while(scanf("%d",&n),n!=0) { line a; vector<line> p; //线段向量 vector<int> v; //记录线段向量的下标 p.clear(); v.clear(); scanf("%lf %lf %lf %lf",&a.a.x,&a.a.y,&a.b.x,&a.b.y); p.push_back(a); v.push_back(1); for(int k=2;k<=n;++k) { scanf("%lf %lf %lf %lf",&a.a.x,&a.a.y,&a.b.x,&a.b.y); for(int i=0; i<(int)p.size(); ++i) { bool flag = line_make_point_one(a,p[i]); if(flag==true) { p.erase(p.begin()+i); v.erase(v.begin()+i); i--; } } p.push_back(a); v.push_back(k); } printf("Top sticks:"); int i; for( i=0; i<(int)v.size()-1; ++i) printf(" %d,",v[i]); printf(" %d.\n",v[i]); } return 0; }