#include<bits/stdc++.h>
using namespace std;
int n,in[5005],tmp,lis[5005],tail,len,head[5005];
priority_queue<int,vector<int>,greater<int> >q;
struct line
{
int xl,yl,xr,yr;
}a[5005];
struct EDGE
{
int next,targ;
}Edge[25000005];
double calc(int p,int x)
{
int Y=max(a[p].yl,a[p].yr),y=min(a[p].yl,a[p].yr);
return (double)abs(a[p].yl>a[p].yr?a[p].xr:a[p].xl-x)*(double)(Y-y)/(double)(a[p].xr-a[p].xl)+y;
}
bool blocked(int i,int j)
{
if(a[j].xl<=a[i].xr && a[j].xr>=a[i].xl)
{
if(a[j].xl<=a[i].xl && a[j].xr>=a[i].xr)
{
double yl=calc(j,a[i].xl),yr=calc(j,a[i].xr);
if(yl>a[i].yl && yr>a[i].yr)//这里炸了 调试第一次 yl==1 a[i].yl==3 yr==1.5 a[i].yr==2 但是会直接跳进下面的return
return true;
}
else if(a[j].xl>=a[i].xl && a[j].xr<=a[i].xr)
{
double yl=calc(i,a[j].xl),yr=calc(i,a[j].xr);
if(yl<a[j].yl && yr<a[j].yr)
return true;
}
else
{
bool f1=false,f2=false;
double yl,yr;
if(a[j].xl>a[i].xl)
{
yl=calc(i,a[j].xl);
if(yl<a[j].yl)
f1=true;
}
if(a[j].xl<a[i].xr)
{
yr=calc(i,a[j].xr);
if(yr<a[j].yr)
f2=true;
}
if(a[j].xl<=a[i].xl)
{
yl=calc(j,a[i].xl);
if(yl>a[i].yl)
f1=true;
}
if(a[j].xr>=a[i].xr)
{
yr=calc(j,a[i].xr);
if(yr>a[i].yr)
f2=true;
}
return f1 && f2;
}
}
}
void add(int u,int v)
{
Edge[++len]={head[u],v};
head[u]=len;
}
void Topology_Sort()
{
for(int i=1;i<=n;i++)
if(!in[i])
q.push(i);
while(!q.empty())
{
tmp=q.top();
q.pop();
lis[++tail]=tmp;
for(int i=head[tmp];i;i=Edge[i].next)
{
in[Edge[i].targ]--;
if(!in[Edge[i].targ])
q.push(Edge[i].targ);
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i].xl>>a[i].yl>>a[i].xr>>a[i].yr;
if(a[i].xl>a[i].xr)
{
swap(a[i].xl,a[i].xr);
swap(a[i].yl,a[i].yr);
}
}
for(int i=1;i<n;i++)
for(int j=i+1;j<=n;j++)
{
if(blocked(i,j))
{
add(i,j);
in[j]++;
}
else if(blocked(j,i))
{
add(j,i);
in[i]++;
}
}
Topology_Sort();
for(int i=1;i<=tail;i++)
cout<<lis[i]<<" ";
}
输入
4
1 3 2 2
1 1 3 2
2 4 7 3
3 3 5 3
标准输出
2 1 4 3
我的输出
1 2 3 4
主要问题在我注释的位置
我在调试的时候炸了 运行的时候也会错