题目链接:
http://poj.org/problem?id=2653
题解:
暴力走起,从一条线开始枚举,如果和后面的有相交就去掉。
AC代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
struct node
{
double x1, y1, x2, y2;
}ln[100000];
int t,n;
int fla[100000];
int solve(int i, int j)
{
int flag = 0;
double dac=(ln[i].x1-ln[j].x1)*(ln[i].y1-ln[i].y2)-(ln[i].x1-ln[i].x2)*(ln[i].y1-ln[j].y1);
double dbc=(ln[i].x1-ln[j].x2)*(ln[i].y1-ln[i].y2)-(ln[i].x1-ln[i].x2)*(ln[i].y1-ln[j].y2);
double acb=(ln[j].x1-ln[i].x1)*(ln[j].y1-ln[j].y2)-(ln[j].x1-ln[j].x2)*(ln[j].y1-ln[i].y1);
double adb=(ln[j].x1-ln[i].x2)*(ln[j].y1-ln[j].y2)-(ln[j].x1-ln[j].x2)*(ln[j].y1-ln[i].y2);
if(acb * adb < 0)
flag ++;
if(dbc * dac < 0)
flag ++;
if(flag == 2)
return 1;
else
return 0;
}
int main()
{
while(~scanf("%d", &n))
{
if(n == 0)break;
int cnt = n;
for(int i = 0; i < n; i++)
{
scanf("%lf%lf%lf%lf", &ln[i].x1, &ln[i].y1, &ln[i].x2, &ln[i].y2);
}
for(int i = 0; i < n; i++)
{
for(int j = i + 1; j < n; j++)
{
if(solve(i,j))
{
cnt--;
fla[i] = 1;
break;
}
}
}
printf("Top sticks: ");
for(int i = 0; i < n; i++)
{
if(!fla[i])
{
cnt--;
if(cnt > 0)
printf("%d, ", i+1);
else
printf("%d.\n", i+1);
}
}
memset(fla,0,sizeof(fla));
}
return 0;
}