2019牛客暑期多校訓練營(第五場)three points 1【計算幾何】

題目鏈接:https://ac.nowcoder.com/acm/contest/885/I
思路:先把最長邊的一個點放在矩陣頂點(原點)上,再將最長邊的另一個點放在矩陣框上,通過已知條件求第三個點位置(一定可求),最後判斷第三點是否合理即可。
AC代碼:

#include<bits/stdc++.h>
using namespace std;
double w,h,a,b,c;
const double eps=1e-12;//避免卡精度
struct node
{
    double x,y;
}coo[5];
bool solve(double aa,double bb,double cc,int xx,int yy,int zz)
{
    coo[xx].x=0.0;
    coo[xx].y=0.0;
    double ahpa=0.0;
    if(aa<=w){//長度夠的話就放相鄰
        coo[yy].x=aa;
        coo[yy].y=0.0;
    }
    else{//否則放對邊上
        coo[yy].x=w;
        coo[yy].y=sqrt(aa*aa-w*w);
        ahpa=atan(1.0*coo[yy].y/(1.0*coo[yy].x));
    }
    ahpa+=acos((aa*aa+bb*bb-cc*cc)*1.0/(2*aa*bb));
    coo[zz].x=bb*cos(ahpa);
    coo[zz].y=bb*sin(ahpa);
    if(coo[zz].x>=0-eps&&coo[zz].x<=w+eps&&coo[zz].y>=0-eps&&coo[zz].y<=h+eps){
        printf("%.12f %.12f %.12f %.12f %.12f %.12f\n",coo[0].x,coo[0].y,coo[1].x,coo[1].y,coo[2].x,coo[2].y);
        return true;
    }
    return false;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--){
        scanf("%lf%lf%lf%lf%lf",&w,&h,&a,&b,&c);
        if(solve(a,b,c,0,1,2)){
            continue;
        }
        if(solve(a,c,b,1,0,2)){
            continue;
        }
        if(solve(b,a,c,0,2,1)){
            continue;
        }
        if(solve(b,c,a,2,0,1)){
            continue;
        }
        if(solve(c,a,b,1,2,0)){
            continue;
        }
        if(solve(c,b,a,2,1,0)){
            continue;
        }
    }
    return 0;
}

參考:https://blog.csdn.net/qq_41955236/article/details/98095377

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章