Description
给 3n 3 n 个二维点的坐标,保证无三点共线,要求构造 n n 个互不相交的三角形,输出这个三角形顶点编号
Input
第一行一整数 T T 表示用例组数,每组用例首先输入一整数,之后 3n 3 n 行每行两个整数 xi,yi x i , y i 表示第 i i 个点的横纵坐标
Output
输出 n n 行,每行输出一个三角形的三个顶点编号
Sample Input
1
1
1 2
2 3
3 5
Sample Output
1 2 3
Solution
由于没有三点共线的情况,那么同一横坐标的点至多两个,且不存在三个点纵坐标相同,故将所有点以二维坐标为两个键值升序排,每次选横坐标最小的三个点组成三角形即可,时间复杂度
Code
#include<cstdio>
#include<algorithm>
using namespace std;
#define maxn 3005
struct node
{
int x,y,id;
bool operator<(const node &b)const
{
if(x!=b.x)return x<b.x;
return y<b.y;
}
}a[maxn];
int T,n;
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=1;i<=3*n;i++)
{
scanf("%d%d",&a[i].x,&a[i].y);
a[i].id=i;
}
sort(a+1,a+3*n+1);
for(int i=1;i<=3*n;i+=3)printf("%d %d %d\n",a[i].id,a[i+1].id,a[i+2].id);
}
return 0;
}