1. 程式人生 > >HDU2108 Shape of HDU(判定凸多邊形-模板)

HDU2108 Shape of HDU(判定凸多邊形-模板)

Shape of HDU

Problem Description

話說上回講到海東集團推選老總的事情,最終的結果是XHD以微弱優勢當選,從此以後,“徐隊”的稱呼逐漸被“徐總”所取代,海東集團(HDU)也算是名副其實了。
創業是需要地盤的,HDU向錢江肉絲高新技術開發區申請一塊用地,很快得到了批覆,據說這是因為他們公司研發的“海東牌”老鼠藥科技含量很高,預期將佔全球一半以上的市場。政府劃撥的這塊用地是一個多邊形,為了描述它,我們用逆時針方向的頂點序列來表示,我們很想了解這塊地的基本情況,現在請你程式設計判斷HDU的用地是凸多邊形還是凹多邊形呢?

Input

輸入包含多組測試資料,每組資料佔2行,首先一行是一個整數n,表示多邊形頂點的個數,然後一行是2×n個整數,表示逆時針順序的n個頂點的座標(xi,yi),n為0的時候結束輸入。

Output

對於每個測試例項,如果地塊的形狀為凸多邊形,請輸出“convex”,否則輸出”concave”,每個例項的輸出佔一行。

Sample Input

4
0 0 1 0 1 1 0 1
0

Sample Output

convex


海東集團終於順利成立了!後面的路,他們會順順利利嗎?
欲知後事如何,且聽下回分解——

# 題解

題意

逆時針給定點求是否為凸多邊形

思路

相鄰叉積始終為正即可。

程式碼

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
const double PI = acos(-1.0);
const double eps = 1e-6;
const int INF = 0x3f3f3f3f;
#define zero(x) (((x)>0?(x):-(x))<eps) //ÅжÏÊÇ·ñΪ0 
#define _sign(x) ((x)>eps?1:((x)<-eps?2:0)) 

const int MAXN = 1e6+10;

struct point{
    double x,y;
    point(double x=0,double y=0):x(x),y(y){}
}sav[MAXN];

//ÏòÁ¿²æ»ý 
double xmult (point p1,point p2,point p0){
    return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}

int is_convex(int n,point* p){
    int i,s[3]={1,1,1};
    for (i=0;i<n&&s[1]|s[2];i++)
    s[_sign(xmult(p[(i+1)%n],p[(i+2)%n],p[i]))]=0;
    return s[1]|s[2];
} 

int main() {
    int N;
    while(~scanf("%d",&N)){
        if(N==0)    break;
        memset(sav,0,sizeof(sav));
        for(int i=0;i<N;i++){
            scanf("%lf %lf",&sav[i].x,&sav[i].y);
        }
        int flag = is_convex(N,sav);
        if(flag==1) printf("convex\n");
        else    printf("concave\n");
    }
    return 0;
}