其实这道题也算不上计算几何,但是标准题解上是用凸包写的。我是瞎贪心做的。本身可以一遍过的,但是因为自己zz,输出写错,然后wa了一发。
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6300
题意。给你3*n个点,问输出n个不相交的三角形的三个顶点编号。保证三点不共线。
题解。我们把所有点按照y从小到大,x从小到达排个序,然后依次输出就ok了,为什么这么做是对的呢?
我们不妨画个图。因为任意三点不共线,所以对于任意一个 直线 y = n(n是有理数)都最多只有两个顶点。那么我们从下向上依次选,就不会有相交。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e4+5;
struct Point{
int x;
int y;
int id;
}p[maxn];
bool cmp(Point a,Point b){
if(a.y == b.y)
return a.x < b.x;
else return a.y < b.y;
}
int main(){
int z;
cin >> z;
while(z--){
int n;
cin >> n;
for(int i = 1 ; i <= 3 * n ; i ++){
cin >> p[i].x;
cin >> p[i].y;
p[i].id = i;
}
// for(int i = 1 ; i <= 3 * n ; i ++ ){
// cout << p[i].id << endl;
// }
sort(p+1,p+1+(3*n),cmp);
for(int i = 1 ; i <= 3*n ; i += 3 ){
cout << p[i].id << " " << p[i+1].id << " " << p[i+2].id << endl;
}
}
return 0;
}