大致题意:给一个n代表n根棍子,接下来n行代表这些棍子的两端坐标,输入的顺序就是棍子摆放的顺序,最后输出那些没有被压在下面的棍子。题中还说了,在顶上的棍子不超过1000,所以开个东西记录一下每次摆放完棍子后,顶端的棍子是哪些不就随便过了。没有1a的原因是因为cin超时。。。。。。
最后,代码:
#include<iostream>
#include<queue>
#include<stdio.h>
using namespace std;
struct line
{
double x1,y1,x2,y2;
int id;
};
double multiple_cross(double x1,double y1,double x2,double y2)
{
return x1*y2-x2*y1;
}
bool check(line a,line b)
{
if(!(min(a.x1,a.x2)<=max(b.x1,b.x2)&&min(a.y1,a.y2)<=max(b.y1,b.y2)&&min(b.x1,b.x2)<=max(a.x1,a.x2)&&min(b.y1,b.y2)<=max(a.y1,a.y2)))
return false;
double u,v,w,z;
u=multiple_cross(a.x1-b.x1,a.y1-b.y1,b.x2-b.x1,b.y2-b.y1);
v=multiple_cross(a.x2-b.x1,a.y2-b.y1,b.x2-b.x1,b.y2-b.y1);
w=multiple_cross(b.x1-a.x1,b.y1-a.y1,a.x2-a.x1,a.y2-a.y1);
z=multiple_cross(b.x2-a.x1,b.y2-a.y1,a.x2-a.x1,a.y2-a.y1);
if(u*v<=0&&w*z<=0)
return true;
return false;
}
int main()
{
//ios::sync_with_stdio(false);
int n;
while(cin>>n&&n)
{
queue<line>q;
queue<line>temp;
line a;
for(int i=0;i<n;++i)
{
scanf("%lf %lf %lf %lf",&a.x1,&a.y1,&a.x2,&a.y2);
a.id=i+1;
if(q.empty())
{
q.push(a);
}
else
{
while(!q.empty())
{
if(!check(q.front(),a))
{
temp.push(q.front());
}
q.pop();
}
while(!temp.empty())
{
q.push(temp.front());
temp.pop();
}
q.push(a);
}
}
printf("Top sticks: ");
bool flag=false;
while(!q.empty())
{
if(flag)
{
printf(", ");
}
flag=true;
printf("%d",q.front().id);
q.pop();
}
printf(".\n");
}
return 0;
}