Hunter’s Apprentice (猎人的学徒)——【Green 公式( 判断多边形边界曲线顺/逆时针】

本文介绍了一种通过计算多边形顶点坐标来判断其旋转方向的方法,利用简单数学公式确定多边形是逆时针还是顺时针方向,这对于解决特定问题如陷阱设置方向至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习博客:https://www.cnblogs.com/kyokuhuang/p/4250526.html

伪代码:

double d = 0;
for (int i = 0; i < n - 1; i++) {
    d += -0.5 * ( y[i + 1] + y[i]) * (x[i + 1] - x[i]);
}
if ( d > 0)
    cout << "逆时针" << endl;
else
    cout << "顺时针" << endl;

 

问题 H: Hunter’s Apprentice

时间限制: 1 Sec  内存限制: 128 MB
提交: 451  解决: 97
[提交] [状态] [命题人:admin]

 

题目描述

当你五岁的时候,你惊恐地看着一个带刺的恶魔谋杀了你的父母。要不是你被路过的恶魔猎人罗斯救了,你也会死的。最后她收养了你,把你训练成她的徒弟。

罗斯目前的目标是一个时钟恶魔,它一直在破坏宁静和谦逊的因茨茅斯镇。它每天晚上都出来破坏货物,污损标识,杀死那些愚蠢到来不及四处游荡的人。时钟恶魔赶走了最后一个恶魔猎人;由于它的时间扭曲能力,它是令人难以置信的敏捷和良好的表现在直接战斗。

你们两个花了几个星期的时间在满是灰尘的大部头书中寻找打败这个恶魔的方法。最后,你偶然发现了一篇相关的文章。书中详细描述了一位牧师如何用银、薰衣草、锡和钟表制作陷阱来诱捕钟表恶魔。完成后的疏水阀包含几个部件,这些部件必须按逆时针方向按特定多边形的形状一个一个地放置。书中说,逆时针方向的顺序对于对抗时钟魔鬼加快自己时间的能力很重要,而顺时针方向的顺序只会提高它的速度。

在罗斯为接下来的战斗做准备的时候,你的责任就是制造和部署陷阱。你尽可能仔细地从书中重建每一件作品。不幸的是,那天晚上事情没有按计划进行。在你准备好陷阱之前,钟魔找到了你们俩。罗斯试图与魔鬼搏斗,但很快就失败了。然而,她是在为你争取时间来完成这个陷阱。您可以快速地以多边形的形状在它们周围走动,将每一块放在正确的位置。罗斯被击倒时,你赶紧启动陷阱。就在那时,你想起了书中的警告。下一步你应该做什么?

输入

第一行输入包含一个整数T(1≤T≤100),测试用例的个数。每个测试用例的第一行包含一个整数n(3≤n≤20),即陷阱中棋子的个数。接下来的n行每一行包含两个整数习和yi(|xi|,|yi |≤100),表示第i块所在的x和y坐标。保证多边形是简单的;边只在顶点相交,每个顶点恰好有两条边相交,所有的顶点都是不同的。

输出

对于每个测试用例,如果陷阱设置正确,输出一行包含fight,如果陷阱设置错误,则输出run。

样例输入

复制样例数据

2

3

0 0

1 0

0 1

3

0 0

0 1

1 0

样例输出

fight

run

提示

在第一种情况下,您沿着正确的方向绕多边形旋转,因此可以安全地与时钟魔鬼进行斗争

试着救罗斯。

在第二种情况下,你搞砸了,是时候开始逃跑了。对不起rose!

 

题意:

       题意很简单,就是求多边形是逆时针还是顺时针,我想这道题应该有别的办法,但原谅我的愚笨(⊙﹏⊙)

        当看到有这么一个公式就能求解,真的佩服发现的人!!

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
#include<iostream>
const int INF=1e9+7;
const int xmax=1e5+7;
using namespace std;


int main()
{
    int t,n,x,y;
    scanf("%d",&t);
    while(t--){

       double ans=0.0;
       scanf("%d",&n);

       int pre1,pre2;

       for(int i=1;i<=n;i++){

          scanf("%d%d",&x,&y);

          if(i!=1)
            ans+=(-0.5)*(y+pre2)*(x-pre1);
          pre1=x;pre2=y;
       }

        if(ans>0.0)
            printf("fight\n");
        else
            printf("run\n");
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值