HDU-2108 (判断多边形的凹凸)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=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;
	}
}

猜你喜欢

转载自blog.csdn.net/qq_40482358/article/details/81583992