Chinaunix首页 | 论坛 | 博客
  • 博客访问: 193868
  • 博文数量: 67
  • 博客积分: 2970
  • 博客等级: 少校
  • 技术积分: 685
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-23 11:36
文章分类

全部博文(67)

文章存档

2012年(2)

2011年(19)

2010年(46)

我的朋友

分类: Java

2011-04-01 18:56:58

解题思路:
 
若存在直线L使得线段在其上的投影有公共区域,那么在这个公共区域中任取一点作L的垂线M,则M必交所有的线段,现在沿着L平移M直到M第一次与某条线段相交于那条线段的某一端点P处,然后将M绕着P转动直到M再次与某条线段相交于那条线段的某一端点处,显然此时与M垂直的直线都是所求的投影直线,也就是任意枚举两个线段的端点,看其他线段是否与这两个端点所构成的直线相交。。。
 
注意题目说两个浮点值小于10-8就认为是相同的,因而当枚举的两个端点间断小于10-8就可以看成一个端点,过一个端点的直线显然有无数条直线,与所有线段相交,因而是不能考虑的。以上考虑都是至少含有3条线段的,因而当n=1||n=2时是一定存在这样的直线。
 
  1. import java.io.BufferedInputStream;
  2. import java.util.Scanner;


  3. public class Main {
  4.     static class Point{
  5.         double x,y;
  6.     }
  7.     
  8.     static final double EXP=1e-8;
  9.     static final int N=105;
  10.     
  11.     static Point line[][];
  12.     
  13.     static{
  14.         line=new Point[N][2];
  15.         for(int i=0;i<N;i++) for(int j=0;j<2;j++) line[i][j]=new Point();
  16.     }
  17.     
  18.     static double det(double x1,double y1,double x2,double y2){
  19.         return x1*y2-x2*y1;
  20.     }
  21.     
  22.     static double cross(Point a,Point b,Point c){
  23.         return det(b.x-a.x, b.y-a.y, c.x-a.x, c.y-a.y);
  24.     }
  25.     
  26.     static double dis(Point a,Point b){
  27.         return Math.sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
  28.     }
  29.     
  30.     static boolean solve(int n){
  31.         for(int i=0;i<n;i++){
  32.             for(int j=i+1;j<n;j++){
  33.                 for(int a=0;a<2;a++){
  34.                     for(int b=0;b<2;b++){
  35.                         if(dis(line[i][a], line[j][b])<EXP) continue;
  36.                         boolean exist=true;
  37.                         for(int k=0;k<n;k++){
  38.                             if(k==i||k==j) continue;
  39.                             if(cross(line[i][a], line[j][b], line[k][0])*cross(line[i][a], line[j][b], line[k][1])>EXP){
  40.                                 exist=false;
  41.                                 break;
  42.                             }
  43.                         }
  44.                         if(exist) return true;
  45.                     }
  46.                 }
  47.             }
  48.         }
  49.         return false;
  50.     }
  51.     
  52.     public static void main(String []args){
  53.         Scanner sc=new Scanner(new BufferedInputStream(System.in));
  54.         int cases=sc.nextInt();
  55.         while(cases--!=0){
  56.             int n=sc.nextInt();
  57.             for(int i=0;i<n;i++){
  58.                 line[i][0].x=sc.nextDouble();line[i][0].y=sc.nextDouble();
  59.                 line[i][1].x=sc.nextDouble();line[i][1].y=sc.nextDouble();
  60.             }
  61.             
  62.             if(n==1||n==2||solve(n)) System.out.println("Yes!");
  63.             else System.out.println("No!");
  64.         }
  65.     }
  66. }
阅读(1543) | 评论(0) | 转发(0) |
0

上一篇:多边形的重心

下一篇:hdu2604 Queuing

给主人留下些什么吧!~~