HDU2108 Shape of HDU(判定凸多邊形-模板)
阿新 • • 發佈:2018-11-03
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; }