1. 程式人生 > >HDU-2108 (判斷多邊形的凹凸)

HDU-2108 (判斷多邊形的凹凸)

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

題目大意:中文題,判斷多邊形的凹凸

按順時針或逆時針走,如果有一對邊的叉積小於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;
	}
}