| 多边形-1 | ||||||
| ||||||
| Description | ||||||
| 任意给定一个多边形,判断它是凸还是凹。多边形的顶点以逆时针方向的序列来表示。
| ||||||
| Input | ||||||
| 输入包含多组测试数据,每组数据占两部分。第一行是一个整数n,表示多边形顶点的个数,接下来n(3<=n<=1000)行每行两个整数,表示逆时针顺序的n个顶点的坐标(xi,yi)(-1000<=xi,yi<=1000)。 n为0的时候结束输入。 | ||||||
| Output | ||||||
| 对于每组测试样例,如果多边形的形状为凸多边形,请输出“Convex”,否则输出”Concave”,每组样例的输出占一行。 | ||||||
| Sample Input | ||||||
| 4 | ||||||
| Sample Output | ||||||
| Convex |
一道裸的判断凸凹包的题目,思路形成比较简单。我们拿样例1来说明这个问题:
我们知道,向量叉乘的求出的值要么正,要么负,要么等于0.叉乘>0说明线段是顺时针形成的,反之,逆时针形成的。我们这里拿出样例1中的点,规定编号为A,B,C,D
我们先对ABC判断,如果AB在BC的逆时针方向,那么这里就能形成一个凸角、
我们再对BCD判断,如果BC爱CD的逆时针方向,那么这里也能形成一个凸角、
依次类推,我们能得到这样的结论:如果这样判断n次,全部的边都是在逆时针方向,那么这个多边形就是凸多边形,如果有某三个点没有形成逆时针,那么就是凹多边形、
这里口述并不是完全好理解,这里大家可以画画图。
直接上AC代码:
#include
#include
using namespace std;
int x[12121212];
int y[12121212];
int main()
{int n;while(~scanf("%d",&n)){if(n==0)break;for(int i=0;i

