题意

给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;
}