链接:https://www.nowcoder.com/acm/contest/110/B
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
为了让所有选手都感到开心,Nowcoder练习赛总会包含一些非常基本的问题。 比如说:
按顺时针或逆时针方向给你一个简单的多边形的顶点坐标,请回答此多边形是顺时针还是逆时针。
输入描述:
输入包含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,c, 组成 向量 ab和bc,在判断ab,bc的叉积s,若s>0则为逆时针,否则为顺时针,统计所有相邻的向量叉积,若s>0居多则为逆时针,反之为顺时针
Code :
#include<iostream>
using namespace std;
const int MAX_N=35;
int n;
int a[MAX_N][2];
int main()
{
ios::sync_with_stdio(false);
cin>>n;
for(int i=0;i<n;++i)
cin>>a[i][0]>>a[i][1];
int sum=0;
for(int i=2;i<n;++i)
{
int ax=a[i-2][0]-a[i-1][0],ay=a[i-2][1]-a[i-1][1];
int bx=a[i-1][0]-a[i][0],by=a[i-1][1]-a[i][1];
int s=ax*by-ay*bx;
if(s>0) sum--;
else sum++;
}
if(sum>0) cout<<"clockwise"<<endl;
else cout<<"counterclockwise"<<endl;
return 0;
}