timus 1246. Tethered Dog 解题报告 判断非凸多边形给定的点旋转方向

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值