■1226 Fishnet
全通り試す.面積はヘロンの公式を使えば簡単.- 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;
- int n;
- P[] a, b, c, d;
- void run(){
- for(;;){
- n=sc.nextInt();
- if(n==0){
- break;
- }
- n+=2;
- a=new P[n];
- b=new P[n];
- c=new P[n];
- d=new P[n];
- a[0]=new P(0, 0);
- b[0]=new P(0, 1);
- c[0]=new P(0, 0);
- d[0]=new P(1, 0);
- for(int i=1; i<n-1; i++)
- a[i]=new P(sc.nextDouble(), 0);
- for(int i=1; i<n-1; i++)
- b[i]=new P(sc.nextDouble(), 1);
- for(int i=1; i<n-1; i++)
- c[i]=new P(0, sc.nextDouble());
- for(int i=1; i<n-1; i++)
- d[i]=new P(1, sc.nextDouble());
- a[n-1]=new P(1, 0);
- b[n-1]=new P(1, 1);
- c[n-1]=new P(0, 1);
- d[n-1]=new P(1, 1);
- solve();
- }
- }
- void solve(){
- double ans=0;
- for(int j=0; j<n-1; j++){
- for(int i=0; i<n-1; i++){
- P p1=isLL(a[i], b[i], c[j], d[j]);
- P p2=isLL(a[i+1], b[i+1], c[j], d[j]);
- P p3=isLL(a[i+1], b[i+1], c[j+1], d[j+1]);
- P p4=isLL(a[i], b[i], c[j+1], d[j+1]);
- ans=max(ans, area(p1, p2, p3)+area(p3, p4, p1));
- }
- }
- println(String.format("%.6f", ans+EPS));
- }
- double area(P p1, P p2, P p3){
- double a=p1.sub(p2).abs();
- double b=p2.sub(p3).abs();
- double c=p3.sub(p1).abs();
- double s=(a+b+c)/2;
- return Math.sqrt(s*(s-a)*(s-b)*(s-c));
- }
- // 直線と直線の交点
- P isLL(P p1, P p2, P q1, P q2){
- double d=q2.sub(q1).det(p2.sub(p1));
- if(abs(d)<EPS)
- return null;
- return p1.add(p2.sub(p1).mul(q2.sub(q1).det(q1.sub(p1))/d));
- }
- class P{
- double x, y;
- P(){
- this(0, 0);
- }
- P(double x, double y){
- this.x=x;
- this.y=y;
- }
- P add(P p){
- return new P(x+p.x, y+p.y);
- }
- P sub(P p){
- return new P(x-p.x, y-p.y);
- }
- P mul(double m){
- return new P(x*m, y*m);
- }
- P div(double d){
- return new P(x/d, y/d);
- }
- double abs(){
- return Math.sqrt(abs2());
- }
- double abs2(){
- return x*x+y*y;
- }
- double arg(){
- return Math.atan2(y, x);
- }
- // inner product
- double dot(P p){
- return x*p.x+y*p.y;
- }
- // outer product
- double det(P p){
- return x*p.y-y*p.x;
- }
- P rot90(){
- return new P(-y, x);
- }
- // conjugation
- P conj(){
- return new P(x, -y);
- }
- @Override
- public String toString(){
- return "("+x+", "+y+")";
- }
- }
- 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 件のコメント:
コメントを投稿