zoukankan      html  css  js  c++  java
  • 哈理工oj 1306再遇攻击解题报告

    计算几何类型的题,判断点是否在多边形内,只是这个多边形变成了任意的多边形,这种情况下,用做射线的方法进行判定,要处理两种特殊情况1.正好交点在某个顶点上,这个在真正的算法语言描述里说是当和交点相连的另外两个点如果在交点的同一侧,则算是两个点,若异侧则算一个点,但是这个实现起来确实比较麻烦,其实这个可以用另外一个想法解决,和一个线段交于一个顶点时,如果交的点是两个点中,y坐标较大(或较小)的,则算是一个交点,这样其实等同于理论里的同侧异侧的解决办法

    View Code
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #define N 100
     5 using namespace std;
     6 int min(int a,int b)
     7 {
     8     return a<b?a:b;
     9 }
    10 int max(int a,int b)
    11 {
    12     return a>b?a:b;
    13 }
    14 struct point
    15 {
    16     int x,y;
    17 };
    18 point p[N];
    19 int mul(point p1,point p2,point p3)
    20 {
    21     return (p2.x-p1.x)*(p3.y-p1.y)-(p3.x-p1.x)*(p2.y-p1.y);
    22 }
    23 bool cross(point p1,point p2,point p3,point p4)
    24 {
    25     if(min(p1.x,p2.x)>max(p3.x,p4.x)||max(p1.x,p2.x)<min(p3.x,p4.x))
    26     return false;
    27     if(min(p1.y,p2.y)>max(p3.y,p4.y)||max(p1.y,p2.y)<min(p3.y,p4.y))
    28     return false;
    29     if(mul(p1,p2,p3)*mul(p1,p2,p4)<=0&&mul(p3,p4,p1)*mul(p3,p4,p2)<=0)
    30     return true;
    31     return false;
    32 }
    33 int main()
    34 {
    35     int n,i,j,k;
    36     point p1;
    37     point p2;
    38     int minx;
    39     while(scanf("%d",&n)&&n)
    40     {
    41         scanf("%d%d",&p1.x,&p1.y);
    42         minx=1000;
    43         for(i=0;i<n;i++)
    44         {
    45             scanf("%d%d",&p[i].x,&p[i].y);
    46             if(p[i].x<minx)
    47             minx=p[i].x;
    48         }
    49         p2.x=minx-1;
    50         p2.y=p1.y;
    51         p[n].x=p[0].x;
    52         p[n].y=p[0].y;
    53         int sum=0;
    54         bool q=false;
    55         for(i=0;i<n;i++)
    56         {
    57             if(mul(p1,p[i],p[i+1])==0&&p1.x>=min(p[i].x,p[i+1].x)&&p1.x<=max(p[i].x,p[i+1].x)&&p1.y>=min(p[i].y,p[i+1].y)&&p1.y<=max(p[i].y,p[i+1].y))
    58             {
    59                 q=true;
    60                 break;
    61             }
    62             if(p[i].y==p[i+1].y)
    63             {
    64                 continue;
    65             }
    66             if(cross(p1,p2,p[i],p[i+1]))
    67             {
    68                 if(p1.y!=p[i].y&&p1.y!=p[i+1].y)
    69                 sum++;
    70                 else
    71                 {
    72                     if(min(p[i].y,p[i+1].y)==p1.y)
    73                     sum++;
    74                 }
    75                 //printf("%d %d\n",i,sum);
    76             }
    77         }
    78         if(sum&1)
    79         q=true;
    80         if(q)
    81         printf("Yes\n");
    82         else
    83         printf("No\n");
    84     }
    85     return 0;
    86 }
  • 相关阅读:
    集训总结
    目前世界四大杀毒软件各自的特点
    俺们家老祖宗是搞音乐的
    灰姑娘
    自欺欺人的ie7pro去掉msnlivespaces的顶部广告图片
    利用工具及api接口写博文
    在C#中,异步调用的WebService、Socket及新建线程中操作主线程中UI的方法
    Ubuntu 12.04下载址
    js与php互传参数
    php使用strstr函数 ,判断字符串A中是否含有字符串B
  • 原文地址:https://www.cnblogs.com/caozhenhai/p/2483614.html
Copyright © 2011-2022 走看看