题目原链接:
http://acm.hdu.edu.cn/showproblem.php?pid=2108
分析:
给一个多边形的各个顶点坐标,进而判断多边形的凹凸性,这个一般利用向量叉乘方法,详细内容可以参考我的另一篇博客:
判断多边形的凹凸性
其实总共就是三步:
- 三点为一组来判断,按顺序设为P1,P2,P3。得两个向量P1P3和P1P2
- 计算两个向量叉乘P1P3×P1P2,计算结果记忆为xy-yx,2131 2131
- 计算如果是正,对应凸。否则为凹。只要出现一个凹,那就是凹多边形。
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
int n,x[1005],y[1005];
while(scanf("%d",&n),n)
{
for(int i=0;i<n;i++)
{
scanf("%d %d",&x[i],&y[i]);
}
// 到了最后一个点,还要判断n-1和0和1,所以要把0和1的点复制放到后面
x[n]=x[0];y[n]=y[0];x[n+1]=x[1];y[n+1]=y[1];
// 设为凸多边形
int flag = 1;
int cnt = 1;
for(int i=0;i<=n-1;i++) //3个点为一组判断,最后一组是n-1,n,n+1
{
int ans = (x[i+1]-x[i])*(y[i+2]-y[i])-(y[i+1]-y[i])*(x[i+2]-x[i]);
// 计算为正还是凸,如果出现负,那就是凹
if(ans <= 0)
{
flag=0;
break;
}
}
if(flag)
printf("convex\n"); // 凸多边形
else
printf("concave\n");
}
}