timus 1246. Tethered Dog 解题报告 判断非凸多边形给定的点旋转方向
题目大意我不想翻译了,就是给定点,这些点是按照顺时针还是逆时针给的?!
本来想随便找三个相邻的点叉积判断下不就好了?后来才明白,如果三点共线就麻烦了,后来看到nocow上的回答才知道,要找到最靠右边的点,然后以这个点为中点,判断相邻的点的旋转方式! 这个点最靠右,一定是转折点!!!!
代码借用zzy的!
#include <cstdio>
#include <cstdlib>
struct point { double x,y; }p[200002];
int n,r=0;
double det(point p1,point p2)
{
return p1.x*p2.y-p2.x*p1.y;
}
bool check(point& a,point& b,point& c)
{
a.x-=b.x;
a.y-=b.y;
c.x-=b.x;
c.y-=b.y;
return det(a,c) >= 0.0;
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;++i)
scanf("%lf%lf",&p[i].x,&p[i].y);
p[n+1]=p[1],p[0]=p[n];
for (int i=1;i<=n;++i)
if (p[i].x > p[r].x)
r=i;
if (!r) r=n;
if (check(p[r-1],p[r],p[r+1])) printf("cw\n");
else printf("ccw\n");
return 0;
}
//by zzy