这道题是一个贪心算法,其实自己仔细想一下是可以写的,我们只需要管x坐标,因为题目上说了不可能有三个点共线,所以可以想一下只要他们的x坐标不同那么就能三个x值构成一个三角形,这样结果就出来了。
读者可以做一下每个点再x轴上投影就可以了,也可以做x相等的点,同样可以这样构成,所以只需要记录x坐标值然后sort()一下就出来了注意是三个点构成一个三角形,所以需要跳下标,这里用了struct按照x递增排序
代码:
#include<bits/stdc++.h>
#include<iostream>
#include<string>
#include<map>
#include<cmath>
#include<queue>
#include<stack>
#include<cstring>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long ll;
struct point{
int x,y;
int index;
}p[3005];
bool cmp(point a,point b){
return a.x<b.x;
}
int main(){
int t,x,y,n;
cin>>t;
while(t--){
cin>>n;
for(int i=1;i<=3*n;i++){
cin>>p[i].x>>p[i].y;
p[i].index=i;
}
int j=1;
sort(p+1,p+3*n+1,cmp);
for(int i=1;i<=n;i++){
cout<<p[j].index<<" "<<p[j+1].index<<" "<<p[j+2].index<<"\n";
j+=3;
}
}
}