80分求助!第一个样例WA了
查看原帖
80分求助!第一个样例WA了
572403
Wangzehao2009楼主2023/6/6 22:42
#include <bits/stdc++.h>
using namespace std;
int const N=100;
struct node{double x,y[4];};
node qiang[25];
bool is_ok(int i,int j,double x1,double y1,double x2,double y2)
{
    for(int k=i+1;k<j;k++)
    {
        double y=(qiang[k].x-x1)/(x2-x1)*(y2-y1)+y1;
        if((y>=qiang[k].y[0] && y<=qiang[k].y[1]) || (y>=qiang[k].y[2] && y<=qiang[k].y[3]))
            continue;
        return false;
    }
    return true;
}
double len(double x1,double y1,double x2,double y2)
{
    return sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
}
vector < pair<int,double> > g[N];
priority_queue < pair<double,int> > q;
int n;
double dis[N];
bool vis[N];
void Dijkstra(int s)
{
    for(int i=0;i<=4*n+1;i++) dis[i]=1e9;
    dis[s]=0;
    q.push({0,s});
    while(!q.empty())
    {
        int u=q.top().second;
        q.pop();
        if(vis[u]) continue;
        vis[u]=1;
        for(auto e:g[u])
        {
            int v=e.first;
            double w=e.second;
            if(dis[u]+w<dis[v])
            {
                dis[v]=dis[u]+w;
                q.push({-dis[v],v});
            }
        }
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>qiang[i].x>>qiang[i].y[0]>>qiang[i].y[1]>>qiang[i].y[2]>>qiang[i].y[3];
    for(int i=1;i<=n;i++)
    {
        for(int j=i+1;j<=n;j++)
        {
            for(int l=0;l<4;l++)
                for(int r=0;r<4;r++)
                    if(is_ok(i,j,qiang[i].x,qiang[i].y[l],qiang[j].x,qiang[j].y[r]))
                        g[4*(i-1)+l+1].push_back({4*(j-1)+r+1,len(qiang[i].x,qiang[i].y[l],qiang[j].x,qiang[j].y[r])});
        }
        for(int j=0;j<4;j++)
        {
            if(is_ok(0,i,0,5,qiang[i].x,qiang[i].y[j])) g[0].push_back({4*(i-1)+j+1,len(0,5,qiang[i].x,qiang[i].y[j])});
            if(is_ok(i,n+1,qiang[i].x,qiang[i].y[j],10,5)) g[4*(i-1)+j+1].push_back({4*n+1,len(qiang[i].x,qiang[i].y[j],10,5)});
        }
    }
    Dijkstra(0);
    cout<<setprecision(2)<<fixed<<dis[4*n+1]<<endl;
    return 0;
}
2023/6/6 22:42
加载中...