• HDU2108+几何+判断凸多边形


    View Code
     1 /*
     2 几何+判断凸多边形
     3 */
     4 #include<stdio.h>
     5 #include<string.h>
     6 #include<stdlib.h>
     7 #include<algorithm>
     8 #include<iostream>
     9 #include<queue>
    10 //#include<map>
    11 #include<math.h>
    12 using namespace std;
    13 typedef long long ll;
    14 //typedef __int64 int64;
    15 const int maxn = 205;
    16 const int inf = 0x7fffffff;
    17 const double pi=acos(-1.0);
    18 const double eps = 1e-8;
    19 struct point {
    20     double x,y;
    21 };
    22 point p[ maxn ];
    23 int judge( double x ){
    24     if( x>eps )
    25         return 1;
    26     if( x<-eps )
    27         return 2;
    28     return 0;
    29 }
    30 double xmult( point a,point b,point c ){
    31     return ( a.x-c.x )*( b.y-c.y ) - ( a.y-c.y )*( b.x-c.x );
    32 }
    33 /*
    34 xmult:
    35 b
    36 |
    37 |
    38 c---a( from a to b )
    39 */
    40 int is_convex( int n,point p[] ){
    41     int flag[]={1,1,1};
    42     for( int i=0;i<n&&( flag[1]|flag[2] );i++ ){
    43          flag[ judge( xmult( p[ (i+1)%n ],p[ (i+2)%n ],p[ i ] ) ) ]=0;
    44     }
    45     return flag[1]|flag[2];
    46 }//判定凸多边形,允许相邻边共线
    47 /*
    48 int solve( int n  ){
    49     for( int i=0;i<n;i++ ){
    50          if (judge( xmult( p[ (i+1)%n ],p[ (i+2)%n ],p[ i ] ) )==2)
    51          return -1;
    52     }
    53     return 1;
    54 }
    55 */    
    56 int main(){
    57     int n;
    58     while( scanf("%d",&n)!=EOF,n ){
    59         for( int i=0;i<n;i++ )
    60             scanf("%lf%lf",&p[ i ].x,&p[ i ].y);
    61             
    62         if( is_convex(n,p)==true )
    63             printf("convex\n");
    64         else
    65             printf("concave\n");
    66             
    67         /*
    68         if(solve(n)==1)printf("convex\n");
    69         else printf("concave\n");
    70         */
    71     }
    72     return 0;
    73 }

    再附上 判断多边形,不允许相邻边共线的模板

    View Code
    1 int is_convex2( int n,point p[] ){
    2     int flag[]={1,1,1};
    3     for( int i=0;i<n&&flag[0]&&( flag[1]|flag[2] );i++ ){
    4          flag[ judge( xmult( p[ (i+1)%n ],p[ (i+2)%n ],p[ i ] ) ) ]=0;
    5     }
    6     return flag[0]&&flag[1]|flag[2];
    7 }//判定凸多边形,不允许相邻边共线

     flag[ 0 ]的值 代表的是 是否出现过共线的情况

    flag[ 1 ]的值 代表的是 是否出现过“正旋转”的情况

    flag[ 2 ]的值 代表的是 是否出现过“负旋转”的情况

    keep moving...
  • 相关阅读:
    python核心编程2 第八章 练习
    python核心编程2 第六章 练习
    python核心编程2 第五章 练习
    Redis
    CENTOS7错误:Cannot find a valid baseurl for repo: base/7/x86_6
    HTTP协议
    计算机网络知识点
    好记性不如烂笔头~
    一些算法题
    解决mysql插入数据时出现Incorrect string value: 'xF0x9F...' 的异常
  • 原文地址:https://www.cnblogs.com/xxx0624/p/2969172.html
Copyright © 2020-2023  润新知