zoukankan      html  css  js  c++  java
  • POJ 1066 计算几何 线段相交

    题意:

    求从目标点走矩形框至少要穿越多少条边。

    题解:

    从矩形框上穿出等价于从直线与矩形框的顶点穿出。

    矩形框四个角特判!

    View Code
     1 #include <iostream>
     2 #include <cstring>
     3 #include <cstdlib>
     4 #include <cstdio>
     5 #include <algorithm>
     6 
     7 #define N 10000
     8 #define EPS 1e-8
     9 
    10 using namespace std;
    11 
    12 struct LI
    13 {
    14     double x,y;
    15 }li[N][2],mi,co;
    16 
    17 int n,ans;
    18 
    19 inline void read()
    20 {
    21     for(int i=1;i<=n;i++)
    22         scanf("%lf%lf%lf%lf",&li[i][0].x,&li[i][0].y,&li[i][1].x,&li[i][1].y);
    23     scanf("%lf%lf",&mi.x,&mi.y);
    24 }
    25 
    26 inline double cross(const LI &o,const LI &a,const LI &b)
    27 {
    28     double fx=a.x-o.x,fy=a.y-o.y,px=b.x-o.x,py=b.y-o.y;
    29     return fx*py-fy*px;
    30 }
    31 
    32 inline int judge(const LI &a1,const LI &a2,const LI &b1,const LI &b2)
    33 {
    34     double fg1=cross(a1,a2,b1)*cross(a1,a2,b2);
    35     double fg2=cross(b1,b2,a1)*cross(b1,b2,a2);
    36     if(fg1<EPS&&fg2<EPS) return 1;
    37     return false;
    38 }
    39 
    40 inline int check(int x,int p)
    41 {
    42     int num=0;
    43     for(int i=1;i<=n;i++)
    44         num+=judge(mi,li[x][p],li[i][0],li[i][1]);
    45     return num;
    46 }
    47 
    48 inline void prp()
    49 {
    50     int num;
    51     num=1;
    52     co.x=co.y=0.0;
    53     for(int i=1;i<=n;i++)
    54         num+=judge(mi,co,li[i][0],li[i][1]);
    55     ans=min(ans,num);
    56     
    57     num=1;
    58     co.x=co.y=100.0;
    59     for(int i=1;i<=n;i++)
    60         num+=judge(mi,co,li[i][0],li[i][1]);
    61     ans=min(ans,num);
    62     
    63     num=1;
    64     co.x=0.0;co.y=100.0;
    65     for(int i=1;i<=n;i++)
    66         num+=judge(mi,co,li[i][0],li[i][1]);
    67     ans=min(ans,num);
    68     
    69     num=1;
    70     co.x=100.0;co.y=0.0;
    71     for(int i=1;i<=n;i++)
    72         num+=judge(mi,co,li[i][0],li[i][1]);
    73     ans=min(ans,num);
    74 }
    75 
    76 inline void go()
    77 {
    78     ans=0x3f3f3f3f;
    79     for(int i=1;i<=n;i++)
    80         for(int j=0;j<=1;j++)
    81             ans=min(ans,check(i,j));
    82     prp();
    83     printf("Number of doors = %d\n",ans);
    84 }
    85 
    86 int main()
    87 {
    88     while(scanf("%d",&n)!=EOF) read(),go();
    89     return 0;
    90 }
  • 相关阅读:
    树上倍增求LCA(最近公共祖先)
    NOI题库分治算法刷题记录
    NOI题库刷题日志 (贪心篇题解)
    O(nlogn)LIS及LCS算法
    BLOG搬家
    『素数 Prime判定和线性欧拉筛法 The sieve of Euler』
    『扩展欧几里得算法 Extended Euclid』
    『NOIP2018普及组题解』
    P25、面试题1:赋值运算符函数
    字符串转成整数
  • 原文地址:https://www.cnblogs.com/proverbs/p/2855580.html
Copyright © 2011-2022 走看看