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/