rt,思路是一次函数判断是否发生碰撞,然后拓扑排序。
#include<bits/stdc++.h>
using namespace std;
#define int long long
vector<int> V[5005];
int in[5005];
long double x[5005],y[5005],x2[5005],y2[5005];
long double k[5005],b[5005];
signed main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>x[i]>>y[i]>>x2[i]>>y2[i];
if(x[i]>x2[i]){
swap(x[i],x2[i]);
swap(y[i],y2[i]);
}
if(x[i]==x2[i]){
k[i]=0,b[i]=max(y[i],y2[i]);
}else{
k[i]=(y[i]-y2[i])/(x[i]-x2[i]);
b[i]=y[i]-x[i]*k[i];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==j) continue;
if(k[i]==0&&k[j]==0&&x[i]==x2[i]&&x[j]==x2[j]){
if(y[i]<y[j]&&x[i]==x[j]){
V[i].push_back(j);
in[j]++;
continue;
}
}
if((x[i]<=x[j]&&x[j]<=x2[i]&&k[i]*x[j]+b[i]<y[j])
||(x[i]<=x2[j]&&x2[j]<=x2[i]&&k[i]*x2[j]+b[i]<y2[j])){
V[i].push_back(j);
in[j]++;
}
}
}
queue<int> Q;
for(int i=1;i<=n;i++){
if(in[i]==0){
Q.push(i);
}
}
while(!Q.empty()){
int u=Q.front();
Q.pop();
cout<<u<<" ";
for(int v:V[u]){
in[v]--;
if(in[v]==0){
Q.push(v);
}
}
}
}