题目描述:http://poj.org/problem?id=2007
题目大意:
给定一个凸包的点集(一定包括原点,并且在输入中总是第一个),然后根据点的极角从小到大排序。
解题思路:
真的只需要根据极角排序就行了,连计算凸包都不用写。
比较极角大小的话我用atan2就会RE.. 改成用叉乘符号判断顺时针还是逆时针就过了..
即假设P1(x1, y1),P2(x2, y2)。 叉乘结果x1*y2-x2*y1如果大于零,则P2与原点的连线在P1逆时针方向。
<span style="font-family:Microsoft YaHei;">/*
* <span style="white-space:pre"> </span>2014.11.08
* Problem: 2007
* Memory: 184K Time: 0MS
* Language: C++ Result: Accepted
*
*/
#include "stdio.h"
#include "math.h"
#define MAXN 107
struct Point {
double x, y;
}p[MAXN];
int n;
bool cw(struct Point a, struct Point b) {
return (a.x*b.y - b.x*a.y) > 0;
}
void sort(int l, int r) {
int i=l, j=r;
Point w;
w.x = p[(l+r)>>1].x;
w.y = p[(l+r)>>1].y;
do {
while ( cw(p[i], w)) i++;
while ( cw(w, p[j])) j--;
if (i<=j) {
Point t = p[i]; p[i] = p[j]; p[j] = t;
i++; j--;
}
} while (i<=j);
if (i<r) sort(i, r);
if (l<j) sort(l, j);
}
int main() {
n = 1;
while (scanf("%lf %lf", &p[n].x, &p[n].y) != EOF) n++;
n--;
sort(2, n);
for (int i=1; i<=n; i++) printf("(%.0lf,%.0lf)\n", p[i].x, p[i].y);
}</span>