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