zoukankan      html  css  js  c++  java
  • hdu2108(判断凸多边形)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2108

    题意:

    给出一个多边形的所有顶点,判断是不是凸多边形;

    思路:

    判断凸多边形的方法比较多,如:若存在一条边,它的两边都有点,那么它是凹多边形;若存在一个点,去掉它后该多边形的面积大于原来的多边形,则它是凹多边形;

    我们还可以用相邻两边的旋转角来判断,逆时针取点,若存在点p1, p2, p3,矢边p1p2, 到p2p3,为顺时针旋转则此多边形为凹多边形;

    对于判断旋转角,我们可以用矢量乘积来判断:

    令 gg=p1p2*p2p3;

    若gg<0, 其旋转为顺时针;

    若gg=0, 两边共线;

    若gg>0, 其旋转为逆时针;

    对于如何计算二维向量的叉积,我们可以将其纵坐标看做0,再像计算三维向量叉积那样用行列式计算;

    p1p2*p2p3=x1*y2-x2*y1;、

    此方法代码比较简洁,时间复杂度也较小,我们就选这个方法啦;

    代码:

     1 #include <iostream>
     2 #include <stdio.h>
     3 #define MAXN 1000001
     4 using namespace std;
     5 
     6 int a[MAXN], b[MAXN];
     7 
     8 int gg(int p1, int p2, int p3){
     9     int jj=(a[p2]-a[p1])*(b[p3]-b[p2])-(a[p3]-a[p2])*(b[p2]-b[p1]);
    10     return jj<0?0:1;
    11 }
    12 
    13 int main(void){
    14     int n;
    15     while(scanf("%d", &n)&&n){
    16         for(int i=0; i<n; i++){
    17             scanf("%d%d", &a[i], &b[i]);
    18         }
    19         int flag=1;
    20         a[n]=a[0], b[n]=b[0]; //***注意第n-1个点的判断
    21         a[n+1]=a[1], b[n+1]=b[1];
    22         for(int i=0; i<n; i++){
    23             flag=gg(i, i+1, i+2);
    24             if(!flag){
    25                 printf("concave
    ");
    26                 break;
    27             }
    28         }
    29         if(!flag){
    30             continue;
    31         }
    32         printf("convex
    ");
    33     }
    34     return 0;
    35 }
  • 相关阅读:
    P1908 逆序对
    P3834 【模板】可持久化线段树 1(主席树)
    BZOJ 4300: 绝世好题
    Codevs 2185【模板】最长公共上升子序列
    P1439 【模板】最长公共子序列
    P3865 【模板】ST表
    【转】良心的可持久化线段树教程
    Codevs 1299 切水果
    P3388 【模板】割点(割顶)&& 桥
    P3805 【模板】manacher算法
  • 原文地址:https://www.cnblogs.com/geloutingyu/p/6075145.html
Copyright © 2011-2022 走看看