Codeforces 1158D Winding polygonal line

题意

给n个点,构造一个遍历顺序,共有 n-2 个转弯点,要求 左转或右转的 序列为题目要求的。

题解

看了官方的题解来的
这个序列一定存在
首先,出发点一定是一个角落里的点,不妨取最左下的点
确定下一步要走的点的步骤
将现在所在的点和未走的点连线
如果是左转,则要取最考右的点,因为这样能保证下下步走时一定是左转
如果是右转,则要取最考左的点,因为这样能保证下下步走时一定是右转

代码
#include<bits/stdc++.h>
#define N 2010
#define LL long long
using namespace std;

struct Point{
    int x,y;
    Point(int x=0,int y=0):x(x),y(y){}
    Point operator - (const Point z) const{return Point(x-z.x,y-z.y);}
    friend LL Cross(Point a,Point b){return 1ll*a.x*b.y-1ll*a.y*b.x; }
}a[N],b[N];
bool f[N];
char ch[N];

int main(int argc, char const *argv[])
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++) cin>>a[i].x>>a[i].y;
    cin>>ch;
    int p=0;
    for(int i=1;i<n;i++) if (a[i].y<a[p].y||a[i].y==a[p].y&&a[i].x<a[p].x) p=i;
    f[p]=1; cout<<p+1<<' ';
    for(int i=0;!i||ch[i-1];i++){
        int x=-1;
        for(int j=0;j<n;j++) if (!f[j]) {
            if (x==-1) x=j;else
            if (ch[i]=='L') if (Cross(a[j]-a[p],a[x]-a[p])>0) x=j;else;else
                            if (Cross(a[j]-a[p],a[x]-a[p])<0) x=j;
        }
        cout<<x+1<<' ';f[x]=1; p=x;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值