zoukankan      html  css  js  c++  java
  • 牛客练习赛18 B 简单多边形

    题面:

    题目描述

    按顺时针或逆时针方向给你一个简单的多边形的顶点坐标,请回答此多边形是顺时针还是逆时针。

    输入描述:

    输入包含N + 1行。
    第一行包含一个整数N,表示简单多边形的顶点数。
    在下面的N行中,第i行包含两个整数xi,yi,表示简单多边形中的第i个顶点的坐标。
    

    输出描述:

    如果简单多边形按顺时针顺序给出,则在一行中输出“clockwise”(不带引号)。 否则,打印"counterclockwise''(不带引号)。
    

    示例1

    输入

    3
    0 0
    1 0
    0 1
    

    输出

    counterclockwise
    

    示例2

    输入

    3
    0 0
    0 1
    1 0
    

    输出

    clockwise
    

    备注:

    3≤N≤30
    -1000≤xi,yi≤1000
    数据保证,这个简单多边形的面积不为零。
    

    大致思路:

    我之前从来没有做过这种类似于多边形的题,这次在做的时候做的很痛苦,虽然是一道非常简单的题目。
    这个题比较优美的做法是看有向面积的正负数量。
    下面来介绍一个叉积和有向面积:
    两个向量a和b的叉积等于a和b组成的三角形的有向面积的两倍。有向面积的概念是,朝着向量a看,如果向量b在你左边,则叉积大于0;如果在你右边,则小于0。

    如上图所示,Cross(a,b)>0,且它的值为灰色阴影部分的面积。

    有向面积的计算方法:

    (x_1(a_1,b_1),x_2(a_2,b_2))

    (S = (x_1 imes x_2 = a_1 *b2 - a2 * b1)/2)

    (S>0) 说明现在是向顺时针方向,反之则是逆时针方向。

    那么统计面积的正负,就能够得到答案。

    代码:

    #include<cstdio>
    #include<iostream>
    using namespace std;
    int x[50],y[50];
    int main(){
        int n,ans=0;
        cin >> n;
        for(int i =0;i <n;i++){
            cin >> x[i];
            cin >> y[i];
        }
        int a1,a2,b1,b2,s;
        for(int i =2;i<n;i++){
            a1=x[i-1]-x[0];
            b1=y[i-1]-y[0];
            a2=x[i]-x[0];
            b2=y[i]-y[0];
            s=(a1*b2-b1*a2);
            if(s>0)
                ans++;
            else
                ans--;
        }
        if(ans>0) cout <<"counterclockwise"<<endl;
        else if(ans <0) cout << "clockwise"<<endl;
        return 0;
    }
    
    
  • 相关阅读:
    51nod贪心算法入门-----完美字符串
    HDU6030----矩阵快速幂
    O(n)求1~n的逆元
    (四)添加签到奖励功能
    (三)开始在OJ上添加签到功能
    (二)OJ的主要文件
    (一)在linux上ubuntu搭建hustOJ系统
    CF 148A Insomnia cure
    lower_bound和upper_bound
    C++ string的常用功能
  • 原文地址:https://www.cnblogs.com/SCaryon/p/9061677.html
Copyright © 2011-2022 走看看