寝癖頭の解法

学習中の覚え書きを投稿、更新していきます。

Aizu Online Judge in C++ #CGL_2_D : Distance

Aizu Online Judge(AOJ)の過去問から、その提出コードの解答例です。

・問題 "Distance"
https://onlinejudge.u-aizu.ac.jp/problems/CGL_2_D
・距離

僕が作成、提出したコードは、以下のとおりです。

Aizu Online Judge in C++ #CGL_2_D : Distance
/*
Aizu Online Judge in C++ #CGL_2_D : Distance
https://onlinejudge.u-aizu.ac.jp/problems/CGL_2_D
 提出コードの解答例
 https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
typedef complex<double> P;
const double num=1e-10;
P inputP(void){
    int x,y;
    cin>>x>>y;
    return P(x,y);
}
int f(P a,P b,P c){
    b-=a;
    c-=a;
    a=c*conj(b);
    if(a.imag()>num){
        return 1;
    }
    if(a.imag()<-num){
        return -1;
    }
    if(a.real()<-num){
        return 2;
    }
    if(abs(b)+num<abs(c)){
        return -2;
    }
    return 0;
}
bool tf(P a,P b,P c,P d){
    return (f(a,b,c)*f(a,b,d)<=0 && (f(c,d,a)*f(c,d,b)<=0));
}
double f1(P a,P b){
    return real(b*conj(a));
}
double f2(P a,P b){
    return imag(b*conj(a));
}
double f3(P a,P b,P c){
    if(f1(b-a,c-a)<0){
        return abs(c-a);
    }
    if(f1(a-b,c-b)<0){
        return abs(c-b);
    }
    return abs(f2(b-a,c-a))/abs(b-a);
}
double f4(P a,P b,P c,P d){
    if(tf(a,b,c,d)){
        return 0;
    }
    double num1=min(f3(a,b,c),f3(a,b,d));
    double num2=min(f3(c,d,a),f3(c,d,b));
    return min(num1,num2);
}
int main(void){
    int t;
    cin>>t;
    while(t--){
        P a,b,c,d;
        a=inputP();
        b=inputP();
        c=inputP();
        d=inputP();
        cout<<fixed<<setprecision(10)<<f4(a,b,c,d)<<endl;
    }
    return 0;
}

設問の出典は、プログラミング問題のオンライン採点システム「Aizu Online Judge(AOJ)」です。
http://judge.u-aizu.ac.jp/onlinejudge/