■1216 Lost in Space
全探索で間に合う.元の三角形の辺の長さをd[i]とする.
与えられた座標軍からある3点を選び,それぞれの辺の長さをe[i]とする.
この時,それぞれの辺の比r[i]は,
r[i]=e[i]/d[i]
となる.
それぞれの比の誤差が,0.1%以上になることは無い,というのだから,任意のi,jに対して,
|r[i]-r[j]|/r[i] < 0.1
となる.
import java.util.*; import java.lang.*; import java.math.*; import java.io.*; import static java.lang.Math.*; import static java.util.Arrays.*; public class Main{ Scanner sc=new Scanner(System.in); int INF=1<<28; double EPS=1e-9; double[] d; P[] ps; int n; void run(){ d=new double[3]; for(int t=sc.nextInt(); t>0; t--){ for(int i=0; i<3; i++){ d[i]=sc.nextDouble(); } n=sc.nextInt(); ps=new P[n]; for(int i=0; i<n; i++){ double x=sc.nextDouble(); double y=sc.nextDouble(); double z=sc.nextDouble(); ps[i]=new P(x, y, z); } solve(); } } void solve(){ double[] len={0, 0, 0}; for(int c=0; c<n; c++){ for(int b=0; b<n; b++){ if(b==c){ continue; } for(int a=0; a<n; a++){ if(a==b||a==c){ continue; } len[0]=ps[b].sub(ps[c]).abs()/d[0]; len[1]=ps[c].sub(ps[a]).abs()/d[1]; len[2]=ps[a].sub(ps[b]).abs()/d[2]; boolean error=false; for(int i=0; i<3; i++){ int p=i; int q=(i+1)%3; error|=abs(len[p]-len[q])/len[p]+EPS>=0.001; } if(!error){ println((a+1)+" "+(b+1)+" "+(c+1)); } } } } } class P{ double x, y, z; P(){ this(0, 0, 0); } P(double x, double y, double z){ this.x=x; this.y=y; this.z=z; } P add(P p){ return new P(x+p.x, y+p.y, z+p.y); } P sub(P p){ return new P(x-p.x, y-p.y, z-p.z); } P mul(double m){ return new P(x*m, y*m, z*m); } P div(double d){ return new P(x/d, y/d, z/d); } double abs(){ return Math.sqrt(abs2()); } double abs2(){ return x*x+y*y+z*z; } // inner product double dot(P p){ return x*p.x+y*p.y+z*p.y; } // outer product P det(P p){ return new P(y*p.z-z*p.y, z*p.x-x*p.z, x*p.y-y*p.x); } @Override public String toString(){ return x+", "+y+", "+z; } } void debug(Object... os){ System.err.println(Arrays.deepToString(os)); } void print(String s){ System.out.print(s); } void println(String s){ System.out.println(s); } public static void main(String[] args){ // System.setOut(new PrintStream(new BufferedOutputStream(System.out))); new Main().run(); } }
0 件のコメント:
コメントを投稿