知道是个计算几何的模板题,感觉思路也没问题,暴力超时好无奈。。
待解决中...........
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <deque>
#include <list>
#include <cctype>
#include <algorithm>
#include <climits>
#include <queue>
#include <stack>
#include <cmath>
#include <map>
#include <set>
#include <iomanip>
#include <cstdlib>
#include <ctime>
#define ll long long
#define ull unsigned long long
#define all(x) (x).begin(), (x).end()
#define clr(a, v) memset( a , v , sizeof(a) )
#define pb push_back
#define mp make_pair
#define read(f) freopen(f, "r", stdin)
#define write(f) freopen(f, "w", stdout)
using namespace std;
const double eps = 1e-8;
int cmp ( double x )
{
if ( fabs(x) < eps ) {
return 0;
}
if ( x > 0 ) return 1;
else 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 );
}
friend point operator * ( const point &a, const double &b )
{
return point( a.x * b, a.y * b );
}
friend point operator * ( const double &a, const point &b )
{
return point ( a * b.x, a * b.y );
}
friend point operator / ( const point &a, const double &b )
{
return point( a.x / b, a.y / b );
}
double norm()
{
return sqrt(sqr(x) + sqr(y));
}
};
struct line {
point a;
point b;
line() {}
line( point x, point y ) : a(x), b(y) {}
};
inline double dot ( const point &a, const point&b )
{
return a.x * b.x + a.y * b.y;
}
inline double det( const point &a, const point &b )
{
return a.x * b.y - a.y * b.x;
}
inline bool parallel ( line a, line b )
{
return ! cmp( det( a.a - a.b, b.a - b.b ) );
}
inline bool line_make_point( line a, line b, point& res )
{
if ( parallel(a,b) )
return false;
double s1 = det ( a.a - b.a, b.b - b.a );
double s2 = det ( a.b - b.a, b.b - b.a );
res = ( s1 * a.b - s2 * a.a ) / ( s1 - s2 );
return true;
}
inline bool line_make_point( line a, line b ) {
if ( parallel(a,b) )
return false;
return true;
}
inline bool PointOnSegment ( point p, point s, point t )
{
return cmp ( det ( p - s, t - s ) ) == 0 && cmp ( dot ( p - s, p - t ) ) <= 0;
}
line num[100005];
bool vis[100005];
inline bool place ( int i, int j ) {
int x1 = num[i].a.x;
int x2 = num[i].b.x;
int x3 = num[j].a.x;
int x4 = num[j].b.x;
if ( x1 < min( x3, x4 ) && x2 < min ( x3, x4 ) ) return false;
if ( x3 < min( x1, x2 ) && x4 < min ( x1, x2 ) ) return false;
x1 = num[i].a.y;
x2 = num[i].b.y;
x3 = num[j].a.y;
x4 = num[j].b.y;
if ( x1 < min( x3, x4 ) && x2 < min ( x3, x4 ) ) return false;
if ( x3 < min( x1, x2 ) && x4 < min ( x1, x2 ) ) return false;
return true;
}
int main()
{
//ios::sync_with_stdio( false );
int n;
while ( scanf ( "%d", &n ) && n ) {
clr ( vis, 1 );
clr ( num, 0 );
for ( int i = 0; i < n; i ++ ) {
num[i].a.input();
num[i].b.input();
}
for ( int i = n - 1; i >= 0; i -- ) {
for ( int j = i - 1; j >= 0; j -- ) {
point tmp;
if ( ! vis[j] ) continue;
if ( place( i, j ) ) {
vis[j] = 0;
}
if ( line_make_point ( num[i], num[j], tmp ) ) {
cout << i << ' ' << j << endl;
if ( PointOnSegment( tmp, num[i].a, num[i].b ) && PointOnSegment( tmp, num[j].a, num[j].b ) ) {
vis[j] = 0;
//break;
//cout << j << endl;
}
}
}
}
int ans[100000] = { 0 };
int cnt = 0;
for ( int i = 0; i < n; i ++ ) {
if ( vis[i] ) {
ans[cnt++] = i + 1;
}
}
//int len = ans.size();
printf ( "Top sticks: " );
//cout << "Top sticks: ";
for ( int i = 0; i < cnt - 1; i ++ ) {
printf ( "%d, ", ans[i] );
//cout << ans[i] << ", ";
}
printf ( "%d.\n", ans[cnt-1] );
//cout << ans[len-1] << "." << endl;
}
return 0;
}