HDU 6300 - Triangle Partition [2018杭电多校联赛 C](签到)

题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=6300

【题意】
在平面直角坐标系上给3*n个点,坐标值都是整数,任意三点不共线,你的任务是要用这些点构成n个三角形,同时任意两个三角形不能相交.

【输入格式】
第一行为数据组数,之后每组数据第一行为n,代表有3*n个点,接下来3n行每行两个数x y代表一个点坐标。

【输出格式】
每组数据输出n行,每行三个整数,分别是构成一个三角形的三个点的编号。

【思路】
因为任意三点不共线,所以只要按照x坐标或y坐标的顺序从小到大或从大到小排列后输出即可

#include<bits/stdc++.h>
using namespace std;

const int maxn=1050;

int n;
struct Point{
    int id;
    int x,y;
    Point(int i=0,int xx=0,int yy=0):id(i),x(xx),y(yy){}
    bool operator<(const Point& e)const{
        return x<e.x;
    }
}p[3*maxn];

int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        for(int i=0;i<3*n;++i){
            int x,y;
            scanf("%d%d",&x,&y);
            p[i]=Point(i+1,x,y);
        }
        sort(p,p+3*n);
        for(int i=0;i<3*n;i+=3){
            printf("%d %d %d\n",p[i].id,p[i+1].id,p[i+2].id);
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/xiao_k666/article/details/81200225