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
  • 相关阅读:
    [JXOI2018]游戏
    UltraISO制作启动盘安装CentOS7
    龙芯、鲲鹏、飞腾等国产平台的浏览器
    浏览器相关性能测试网址
    有没有一种组合字体,中文是宋体,英文是times new roman?
    中国航天科工集团第二研究院706所招聘
    华为云
    面试阿里P6难在哪?(面试难点)
    Linux下配置环境变量—— .bashrc 和 /etc/profile
    Linux 内存 占用较高问题排查
  • 原文地址:https://www.cnblogs.com/Fighting-sh/p/9810432.html
Copyright © 2011-2022 走看看