POJ 1696 Space Ant

这道题题目描述一大串,但不难看懂。

方法还是之前一样的向量积应用。向量积的正负,可以判断两个向量的位置关系。比如这道题找逆时针方向的点。

中间找下一个点的算法,是学长指导的,自己想不到,果然技术上还是弱呢

 

 1 #include<iostream>
2 #include<cmath>
3 #include<algorithm>
4 #include<queue>
5 using namespace std;
6
7 struct Point {
8 int index;
9 double x, y;
10 };
11
12 const double eps = 1e-8;
13 Point start;
14
15 double xmulti(const Point p1, const Point p2, const Point p0)
16 {
17 return (p1.x - p0.x) * (p2.y - p0.y) - (p2.x - p0.x) * (p1.y - p0.y);
18 }
19
20 double dis(const Point p1, const Point p2)
21 {
22 return sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));
23 }
24
25 bool cmpY(const Point p1, const Point p2)
26 {
27 if(p1.y == p2.y)
28 return p1.x < p2.x;
29 return p1.y < p2.y;
30 }
31
32 bool cmpNext(const Point p1, const Point p2)
33 {
34 double far = xmulti(p1, p2, start);
35 if(fabs(far) < eps)
36 return dis(p1, start) < dis(p2, start); //如果两个点构成向量共线,则取最近的那个点
37 return far > 0;
38 }
39
40 int main()
41 {
42 int t;
43 cin>>t;
44 while(t--)
45 {
46 int n;
47 cin>>n;
48 Point *food = new Point[n + 5];
49 queue<int> que;
50 for(int i = 1; i <= n; i++)
51 {
52 cin>>food[i].index>>food[i].x>>food[i].y;
53 }
54 sort(food + 1, food + n + 1, cmpY); //找出最靠近原点的点,作为起点
55 que.push(food[1].index);
56 for(int i = 2; i <= n; i++)
57 {
58 start = food[i - 1];
59 sort(food + i, food + n + 1, cmpNext); //每次找出与前一个点成逆时针方向、且距离最近的点
60 que.push(food[i].index);
61 }
62 cout<<que.size();
63 while(!que.empty())
64 {
65 cout<<" "<<que.front();
66 que.pop();
67 }
68 cout<<endl;
69 delete[] food;
70 food = NULL;
71 }
72 return 0;
73 }

 

posted @ 2012-02-22 23:00  dgsrz  阅读(171)  评论(0编辑  收藏  举报