http://poj.org/problem?id=1696
水。求出最大余弦值即可。
完整代码:
/*0ms,548KB*/ #include<cstdio> #include<cstring> #include<cmath> double x[55], y[55], dx, dy; bool vis[55]; ///单位化向量 inline void dentity_vector(double nowx, double nowy, double nextx, double nexty) { double len = hypot(nextx - nowx, nexty - nowy); dx = (nextx - nowx) / len, dy = (nexty - nowy) / len; } ///i=(dx,dy),a=(x-nowx,y-nowy) ///注意向量i已经单位化 inline double getcos(double dx, double dy, double nowx, double nowy, double x, double y) { return (dx * (x - nowx) + dy * (y - nowy)) / hypot(x - nowx, y - nowy); } int main() { int t, n, i, j, now, next; double miny, cos, tmp; scanf("%d", &t); while (t--) { scanf("%d", &n); printf("%d", n); miny = 105; for (i = 1; i <= n; ++i) { scanf("%*d%lf%lf", &x[i], &y[i]); if (y[i] < miny) miny = y[i], now = i; } memset(vis, 0, sizeof(vis)); vis[now] = true; printf(" %d", now); dx = 1.0, dy = 0.0; for (i = 2; i <= n; ++i) { cos = -1.0; for (j = 1; j <= n; ++j) { if (!vis[j]) { double tmp = getcos(dx, dy, x[now], y[now], x[j], y[j]); if (tmp > cos) cos = tmp, next = j; } } dentity_vector(x[now], y[now], x[next], y[next]); now = next; vis[now] = true; printf(" %d", now); } putchar(10); } return 0; }