AOJ1216 Lost in Space
問題リンク Lost in Space
- 概要
三角形の辺の長さQR, RP, PQ(cm)と、N個の3次元座標が与えられる。
N個の中の3点を使い、与えられた三角形と相似になる三角形を作る点の番号を答えよ。
相似とは、三角形の中の全ての2辺の比が、与えられた三角形のそれと誤差が0.01%に収まるものをいう。
3 <= N <= 30
- 解法
1光年は9.461*10^12(km)だなんて書いてありますが、どうせ比を取るので光年をkmに直す必要はないです。
r1 = QR/RP
r2 = RP/PQ
r3 = PQ/QR
とします。
Nの大きさが30しかないので三角形の3頂点を全て試します。そのときの比をr1, r2, r3と同様にR1, R2, R3とします。
これらの差の絶対値が0.0001に収まればそれらが求めたい三角形になっています。
- ソース
import java.util.Scanner; //Lost in Space public class AOJ1216 { void run(){ Scanner sc = new Scanner(System.in); int t = sc.nextInt(); double RATIO = 1e-4; while(t--!=0){ double qr = sc.nextDouble(), rp = sc.nextDouble(), pq = sc.nextDouble(); double r1 = qr/rp, r2 = rp/pq, r3 = pq/qr; int n = sc.nextInt(); double[] x = new double[n+1], y = new double[n+1], z = new double[n+1]; for(int i=1;i<=n;i++){ x[i] = sc.nextDouble(); y[i] = sc.nextDouble(); z[i] = sc.nextDouble(); } for(int p=1;p<=n;p++)for(int q=1;q<=n;q++)for(int r=1;r<=n;r++){ if(p==q||q==r||r==p)continue; double QR = Math.sqrt(Math.pow(x[q]-x[r], 2)+Math.pow(y[q]-y[r], 2)+Math.pow(z[q]-z[r], 2)); double RP = Math.sqrt(Math.pow(x[p]-x[r], 2)+Math.pow(y[p]-y[r], 2)+Math.pow(z[p]-z[r], 2)); double PQ = Math.sqrt(Math.pow(x[q]-x[p], 2)+Math.pow(y[q]-y[p], 2)+Math.pow(z[q]-z[p], 2)); double R1 = QR/RP, R2 = RP/PQ, R3 = PQ/QR; double d1 = Math.abs(r1-R1), d2 = Math.abs(r2-R2), d3 = Math.abs(r3-R3); if(d1<RATIO && d2<RATIO && d3<RATIO){ System.out.println(p+" "+q+" "+r);break; } } } } public static void main(String[] args) { new AOJ1216().run(); } }