HDU-2108 (判斷多邊形的凹凸)
阿新 • • 發佈:2019-02-07
Problem Description 話說上回講到海東集團推選老總的事情,最終的結果是XHD以微弱優勢當選,從此以後,“徐隊”的稱呼逐漸被“徐總”所取代,海東集團(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 海東集團終於順利成立了!後面的路,他們會順順利利嗎? 欲知後事如何,且聽下回分解—— |
題目大意:中文題,判斷多邊形的凹凸
按順時針或逆時針走,如果有一對邊的叉積小於0,即可判斷多邊形是凹的
ac:
#include<stdio.h> #include<string.h> #include<math.h> //#include<map> //#include<set> #include<deque> #include<queue> #include<stack> #include<bitset> #include<string> #include<iostream> #include<algorithm> using namespace std; #define ll long long #define INF 0x3f3f3f3f #define mod 1000000007 //#define max(a,b) (a)>(b)?(a):(b) //#define min(a,b) (a)<(b)?(a):(b) #define clean(a,b) memset(a,b,sizeof(a))// 水印 //std::ios::sync_with_stdio(false); struct node{ double x,y; // node friend operator - (node a,node b){ // return {a.x-b.x,a.y-b.y}; // } node& operator - (node &a){ x=x-a.x; y=y-a.y; return *this; } node (double _x=0,double _y=0):x(_x),y(_y){} }dot[110]; double cross(node a,node b) { return a.x*b.y-a.y*b.x; } int main() { std::ios::sync_with_stdio(false); int n; while(cin>>n&&n) { for(int i=1;i<=n;++i) cin>>dot[i].x>>dot[i].y; if(n<3) { cout<<"concave"<<endl; continue; } dot[n+1]=dot[1]; int f=0; for(int i=1;i<=n;++i) { double res; res=cross(node(dot[i+1].x-dot[i].x,dot[i+1].y-dot[i].y), node(dot[i+2].x-dot[i+1].x,dot[i+2].y-dot[i+1].y)); //b在a左邊res>0; //b在a右邊res<0; //b與a共線res=0; if(res<0) { f=1; break; } } if(f) cout<<"concave"<<endl; else cout<<"convex"<<endl; } }