题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=6300
题意:
给出3n个坐标点。没有三个点共线。要构建n个不相交的三角形
输入:
第一行输入T表示测试用例数。每个测试用例的第一行输入n,表示要构建的三角形个数。接着的3n行,每行两个数x和y,用于表示坐标点。
输出:
对每一个测试用例输出n行,每行输出三个数,分别表示构建的这个三角形用到的三个坐标顶点的下标。如果有多种解决方案,输出任何一种即可。
分析:
题目说明,没有三个点共线,因此只要把点进行排序(先按x排序,如x相同,就对y排序),这样子从左到右,从上到下依次取点,就可以构建n个不相交的三角形。
由于要有坐标点的下标,所以当输入的时候,要把输入的点给一个值,用于知道这个点是第几个输入的。所以构建一个结构体,有三个元素,x、y和vis。
排序用快排sort即可。
AC代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct Point
{
int x,y;
int vis;
}point[3010];
bool cmp(Point a,Point b)
{
if(a.x == b.x) // 相同就按 y 的降序排,否侧按 x 的升序排
return a.y > b.y;
else
return a.x < b.x;
}
int main()
{
//freopen("DATA1003.txt","r",stdin);
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
int pointNum = 3*n;
for(int i = 1;i <= pointNum;i++)
{
scanf("%d %d",&point[i].x,&point[i].y);
point[i].vis = i;
}
sort(point+1,point+pointNum+1,cmp);
for(int i = 1;i <= pointNum;i++)
{
printf("%d",point[i].vis);
if(i%3==0)
printf("\n");
else
printf(" ");
}
}
return 0;
}