zoukankan      html  css  js  c++  java
  • Segments(叉积)

    Segments

    http://poj.org/problem?id=3304

    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 18066   Accepted: 5680

    Description

    Given n segments in the two dimensional space, write a program, which determines if there exists a line such that after projecting these segments on it, all projected segments have at least one point in common.

    Input

    Input begins with a number T showing the number of test cases and then, T test cases follow. Each test case begins with a line containing a positive integer n ≤ 100 showing the number of segments. After that, n lines containing four real numbers x1 y1 x2 y2 follow, in which (x1y1) and (x2y2) are the coordinates of the two endpoints for one of the segments.

    Output

    For each test case, your program must output "Yes!", if a line with desired property exists and must output "No!" otherwise. You must assume that two floating point numbers a and b are equal if |a - b| < 10-8.

    Sample Input

    3
    2
    1.0 2.0 3.0 4.0
    4.0 5.0 6.0 7.0
    3
    0.0 0.0 0.0 1.0
    0.0 1.0 0.0 2.0
    1.0 1.0 2.0 1.0
    3
    0.0 0.0 0.0 1.0
    0.0 2.0 0.0 3.0
    1.0 1.0 2.0 1.0

    Sample Output

    Yes!
    Yes!
    No!

    枚举每两个线段的端点,判断这些端点形成的直线是否与线段都有交点
    还有,题目说如果两个点的距离小于1e-8就看成一个点,所以要考虑重点
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<string>
     6 #include<algorithm>
     7 #include<queue>
     8 #include<vector>
     9 #include<map>
    10 using namespace std;
    11 
    12 struct Point{
    13     double x,y;
    14 };
    15 
    16 struct Line{
    17     Point s,e;
    18 }line[105];
    19 
    20 double Cross(double x0,double y0,double x1,double y1,double x2,double y2){
    21     return (x1-x0)*(y2-y0)-(y1-y0)*(x2-x0);
    22 }
    23 
    24 
    25 double distance(double x1,double y1,double x2,double y2){
    26     return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
    27 }
    28 
    29 bool Check(double x1,double y1,double x2,double y2,int n){
    30     if(distance(x1,y1,x2,y2)<0.00000001) return 0;
    31     for(int i=1;i<=n;i++){
    32         if(Cross(x1,y1,x2,y2,line[i].s.x,line[i].s.y)*Cross(x1,y1,x2,y2,line[i].e.x,line[i].e.y)>0.00000001){
    33             return 0;
    34         }
    35     }
    36     return 1;
    37 }
    38 
    39 bool ac(int n){
    40     Line tmp;
    41     int co=0;
    42     for(int i=1;i<=n;i++){
    43         for(int j=1;j<=n;j++){
    44             tmp.s=line[i].s;
    45             tmp.e=line[j].s;
    46             if(Check(tmp.s.x,tmp.s.y,tmp.e.x,tmp.e.y,n)){
    47                 co=1;
    48             }
    49             tmp.s=line[i].s;
    50             tmp.e=line[j].e;
    51             if(Check(tmp.s.x,tmp.s.y,tmp.e.x,tmp.e.y,n)){
    52                 co=1;
    53             }
    54             tmp.s=line[i].e;
    55             tmp.e=line[j].s;
    56             if(Check(tmp.s.x,tmp.s.y,tmp.e.x,tmp.e.y,n)){
    57                 co=1;
    58             }
    59             tmp.s=line[i].e;
    60             tmp.e=line[j].e;
    61             if(Check(tmp.s.x,tmp.s.y,tmp.e.x,tmp.e.y,n)){
    62                 co=1;
    63             }
    64         }
    65 
    66     }
    67     if(co)
    68         return true;
    69     return false;
    70 }
    71 
    72 int main(){
    73 
    74     int T;
    75     cin>>T;
    76     while(T--){
    77         int n;
    78         cin>>n;
    79         Point s,e;
    80         for(int i=1;i<=n;i++){
    81             cin>>s.x>>s.y>>e.x>>e.y;
    82             line[i].s=s;
    83             line[i].e=e;
    84         }
    85         if(ac(n)){
    86             puts("Yes!");
    87         }
    88         else{
    89             puts("No!");
    90         }
    91     }
    92 
    93 }
    View Code
  • 相关阅读:
    Excel中输入身份证后3位变成0,怎么办?
    Css中如何使英文和拼音变成全大写、全小写和首字母大写?
    css中 font常用的样式属性
    Css的向左浮动、先右浮动、绝对定位、相对定位的简单使用
    如何解决Css属性text-overflow:ellipsis 不起作用(文本溢出显示省略号)
    mysql 基本语法学习1(数据库、数据表、数据列的操作)
    sql server中如何将两个字段数据合并成一个字段显示(字段与字段添加特殊符号)
    Linq to Entity 求最大小值Max/Min返回null的处理方法
    C#匿名对象在其它方法体内怎么取到相应的值(不想建立对应的类并转化的情况下)?
    【转发】JQuery中操作Css样式的方法
  • 原文地址:https://www.cnblogs.com/Fighting-sh/p/9810432.html
Copyright © 2011-2022 走看看