P1027做题记录

没错不写题解了。。。
这题挺难。
然后主要是不太会搞三个点。
突然想到勾股定理。
然后好办了。
求出直角点。
然后套公式计算第四个点。
再建图。
做Flo/Dij。
太爆肝了!坤坤爆!
写完了第一部分,先放在这吧!

#include<bits/stdc++.h>
using namespace std;
struct node{
    int x,y;
};
int D2(int a,int b,int x,int y){
    return (a-x)*(a-x)+(b-y)*(b-y);
}
int D2(int a,int b){
    return a*a+b*b;
}
int Rt(int a,int b,int c,int d,int e,int f){
    if(D2(a,b,c,d)+D2(a,b,e,f)==D2(c,d,e,f))return 1;
    if(D2(a,b,c,d)+D2(c,d,e,f)==D2(a,b,e,f))return 2;
    return 3;
}
node ANT(int a,int b,int c,int d,int e,int f){
    if(Rt(a,b,c,d,e,f)==1){//(a,b)<=>(g,h)
        return {c+e-a,d+f-b};
    }else if(Rt(a,b,c,d,e,f)==2){
        return {a+e-c,b+f-d};
    }else{
        return {a+c-e,b+d-f};
    }
}
double dis(int a,int b,int c,int d){
    return sqrt((double)D2(a,b,c,d));
}

现在调试遇到了一些问题。
当前代码:

#include<bits/stdc++.h>
#define inf 1e9
using namespace std;
struct node{
    int x,y;
};
int D2(int a,int b,int x,int y){
    return (a-x)*(a-x)+(b-y)*(b-y);
}
int D2(int a,int b){
    return a*a+b*b;
}
int Rt(int a,int b,int c,int d,int e,int f){
    if(D2(a,b,c,d)+D2(a,b,e,f)==D2(c,d,e,f))return 1;
    if(D2(a,b,c,d)+D2(c,d,e,f)==D2(a,b,e,f))return 2;
    return 3;
}
node ANT(int a,int b,int c,int d,int e,int f){
    if(Rt(a,b,c,d,e,f)==1){//(a,b)<=>(g,h)
        return {c+e-a,d+f-b};
    }else if(Rt(a,b,c,d,e,f)==2){
        return {a+e-c,b+f-d};
    }else{
        return {a+c-e,b+d-f};
    }
}
double dis(int a,int b,int c,int d){
    return sqrt((double)D2(a,b,c,d));
}
int T,n,p,A,B,t[105],a[105][10],cnt;
double d[405][405];
void printd(double x){
    cout<<setprecision(1)<<fixed<<x;
}
int getx(int id){
    return a[id/4][((id-1)%4+1)*2-1];
}
int gety(int id){
    return a[id/4][((id-1)%4+1)*2];
}
void solve(){
    cin>>n>>p>>A>>B;cnt=0;
    for(int i=1;i<=n*4;i++){
        for(int j=1;j<=n*4;j++){
            d[i][j]=inf;
        }
    }
    for(int i=1;i<=n;i++){
        for(int k=1;k<=6;k++)cin>>a[i][k];
        cin>>t[i];
        node tmp=ANT(a[i][1],a[i][2],a[i][3],a[i][4],a[i][5],a[i][6]);a[i][7]=tmp.x,a[i][8]=tmp.y;
        /*//调试 ok
        for(int k=1;k<=8;k++)cout<<a[i][k]<<' ';
        cout<<'\n';
        //*/
        //建图
        for(int x=1;x<=4;x++){
            for(int y=1;y<=4;y++){
                d[cnt+x][cnt+y]=dis(a[i][x*2-1],a[i][x*2],a[i][y*2-1],a[i][y*2])*t[i];
            }
        }
        cnt+=4;
    }
    for(int i=1;i<=4*n;i++){
        for(int j=1;j<=4*n;j++){
            if((i-1)/4!=(j-1)/4)d[i][j]=dis(getx(i),gety(i),getx(j),gety(j))*p;
        }
    }
    /*//调试 ok
    for(int i=1;i<=4*n;i++){
        for(int j=1;j<=4*n;j++){
            cout<<d[i][j]<<' ';
        }
        cout<<'\n';
    }
    //*/
    for(int k=1;k<=4*n;k++){
        for(int i=1;i<=4*n;i++){
            for(int j=1;j<=4*n;j++){
                d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
            }
        }
    }double ans=inf;
    for(int x=1;x<=4;x++){
        for(int y=1;y<=4;y++){
            ans=min(ans,d[(A-1)*4+x][(B-1)*4+y]);
            //cout<<d[(A-1)*4+x][(B-1)*4+y]<<' ';
        }
        //cout<<'\n';
    }
    printd(ans);cout<<'\n';
}
int main(){
    cin>>T;
    while(T--)solve();
    return 0;
}

哦哦哦!原来是getx和gety出了问题,只要把 id/4 改成 (id+3)/3 就行了!
终于AC了!加上调试,代码总共97行!
不加也快90行了。

posted @ 2026-05-13 22:52  zap2727  阅读(6)  评论(0)    收藏  举报