Space Ant
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 3967   Accepted: 2489

Description

The most exciting space discovery occurred at the end of the 20th century. In 1999, scientists traced down an ant-like creature in the planet Y1999 and called it M11. It has only one eye on the left side of its head and just three feet all on the right side of its body and suffers from three walking limitations: 
  1. It can not turn right due to its special body structure.
  2. It leaves a red path while walking.
  3. It hates to pass over a previously red colored path, and never does that.

The pictures transmitted by the Discovery space ship depicts that plants in the Y1999 grow in special points on the planet. Analysis of several thousands of the pictures have resulted in discovering a magic coordinate system governing the grow points of the plants. In this coordinate system with x and y axes, no two plants share the same x or y
An M11 needs to eat exactly one plant in each day to stay alive. When it eats one plant, it remains there for the rest of the day with no move. Next day, it looks for another plant to go there and eat it. If it can not reach any other plant it dies by the end of the day. Notice that it can reach a plant in any distance. 
The problem is to find a path for an M11 to let it live longest. 
Input is a set of (x, y) coordinates of plants. Suppose A with the coordinates (xA, yA) is the plant with the least y-coordinate. M11 starts from point (0,yA) heading towards plant A. Notice that the solution path should not cross itself and all of the turns should be counter-clockwise. Also note that the solution may visit more than two plants located on a same straight line. 

Input

The first line of the input is M, the number of test cases to be solved (1 <= M <= 10). For each test case, the first line is N, the number of plants in that test case (1 <= N <= 50), followed by N lines for each plant data. Each plant data consists of three integers: the first number is the unique plant index (1..N), followed by two positive integers x and y representing the coordinates of the plant. Plants are sorted by the increasing order on their indices in the input file. Suppose that the values of coordinates are at most 100.

Output

Output should have one separate line for the solution of each test case. A solution is the number of plants on the solution path, followed by the indices of visiting plants in the path in the order of their visits.

Sample Input

  1. 2
  2. 10
  3. 1 4 5
  4. 2 9 8
  5. 3 5 9
  6. 4 1 7
  7. 5 3 2
  8. 6 6 3
  9. 7 10 10
  10. 8 8 1
  11. 9 2 4
  12. 10 7 6
  13. 14
  14. 1 6 11
  15. 2 11 9
  16. 3 8 7
  17. 4 12 8
  18. 5 9 20
  19. 6 3 2
  20. 7 1 6
  21. 8 2 13
  22. 9 15 1
  23. 10 14 17
  24. 11 13 19
  25. 12 5 18
  26. 13 7 3
  27. 14 10 16

Sample Output

  1. 10 8 7 3 4 9 5 6 2 1 10
  2. 14 9 10 11 5 12 8 7 6 13 4 14 1 3 2
  1. /*
  2. poj 1696 叉积理解
  3.  
  4. 给你n个点,要求从一个点出发,每次只能 左or直走. 求路径
  5. 先找出最做下角的点,然后通过叉积排序判断出离当前点需要旋转最小角度可以到达的点
  6. 如果两个点在一条直线上面,则选取距离最近的
  7.  
  8. hhh-2016-05-06 20:40:31
  9. */
  10. #include <iostream>
  11. #include <vector>
  12. #include <cstring>
  13. #include <string>
  14. #include <cstdio>
  15. #include <queue>
  16. #include <cmath>
  17. #include <algorithm>
  18. #include <functional>
  19. #include <map>
  20. using namespace std;
  21. #define lson (i<<1)
  22. #define rson ((i<<1)|1)
  23.  
  24. using namespace std;
  25. const int maxn = 40010;
  26. double eps = 1e-8;
  27. int tot;
  28. int n,m;
  29.  
  30. int sgn(double x)
  31. {
  32. if(fabs(x) < eps) return 0;
  33. if(x < 0)
  34. return -1;
  35. else
  36. return 1;
  37. }
  38.  
  39. struct Point
  40. {
  41. int id;
  42. double x,y;
  43. Point() {}
  44. Point(double _x,double _y)
  45. {
  46. x = _x,y = _y;
  47. }
  48. Point operator -(const Point &b)const
  49. {
  50. return Point(x-b.x,y-b.y);
  51. }
  52. double operator ^(const Point &b)const
  53. {
  54. return x*b.y-y*b.x;
  55. }
  56. double operator *(const Point &b)const
  57. {
  58. return x*b.x + y*b.y;
  59. }
  60. };
  61.  
  62. struct Line
  63. {
  64. Point s,t;
  65. Line() {}
  66. Line(Point _s,Point _t)
  67. {
  68. s = _s;
  69. t = _t;
  70. }
  71. pair<int,Point> operator &(const Line&b)const
  72. {
  73. Point res = s;
  74. if( sgn((s-t) ^ (b.s-b.t)) == 0) //通过叉积判断
  75. {
  76. if( sgn((s-b.t) ^ (b.s-b.t)) == 0)
  77. return make_pair(0,res);
  78. else
  79. return make_pair(1,res);
  80. }
  81. double ta = ((s-b.s)^(b.s-b.t))/((s-t)^(b.s-b.t));
  82. res.x += (t.x-s.x)*ta;
  83. res.y += (t.y-s.y)*ta;
  84. return make_pair(2,res);
  85. }
  86. };
  87. Point tp;
  88. Point po[maxn];
  89.  
  90. double dist(Point a,Point b)
  91. {
  92. return sqrt((a-b)*(a-b));
  93. }
  94.  
  95. bool cmp(Point a,Point b)
  96. {
  97. double t = (a-tp)^(b-tp);
  98. if(sgn(t) == 0)
  99. {
  100. return dist(a,tp) < dist(b,tp);
  101. }
  102. if(sgn(t) < 0)
  103. return false;
  104. else
  105. return true;
  106. }
  107.  
  108. int main()
  109. {
  110. int n,T;
  111. scanf("%d",&T);
  112. while(T--)
  113. {
  114. scanf("%d", &n);
  115. tp.x = 10000,tp.y = 10000;
  116. for(int i = 0; i < n; i++)
  117. {
  118. scanf("%d%lf%lf",&po[i].id,&po[i].x,&po[i].y);
  119. if(po[i].y < tp.y || (po[i].y == tp.y && po[i].x < tp.x))
  120. {
  121. tp = po[i];
  122. }
  123. }
  124.  
  125. for(int i = 0; i < n; i++)
  126. {
  127. sort(po+i,po+n,cmp);
  128. tp = po[i];
  129. }
  130. printf("%d ",n);
  131. for(int i = 0; i < n; i++)
  132. {
  133. printf("%d%c",po[i].id, i == n-1 ? '\n':' ');
  134. }
  135. }
  136. return 0;
  137. }

  

poj 1696 叉积理解的更多相关文章

  1. poj 2318 叉积+二分

    TOYS Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13262   Accepted: 6412 Description ...

  2. poj 1696 (计算几何基础)

    poj 1696 Space Ant 链接:http://poj.org/problem?id=1696 题意:在坐标轴上,给定n个点的 id 以及点的坐标(xi, yi),让你以最底端点开始,从右依 ...

  3. poj 1696 Space Ant(模拟+叉积)

    Space Ant Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3840   Accepted: 2397 Descrip ...

  4. POJ 1696 Space Ant 极角排序(叉积的应用)

    题目大意:给出n个点的编号和坐标,按逆时针方向连接着n个点,按连接的先后顺序输出每个点的编号. 题目思路:Cross(a,b)表示a,b的叉积,若小于0:a在b的逆时针方向,若大于0a在b的顺时针方向 ...

  5. POJ 1696 - Space Ant 凸包的变形

    Technorati Tags: POJ,计算几何,凸包 初学计算几何,引入polygon后的第一个挑战--凸包 此题可用凸包算法做,只要把压入凸包的点从原集合中排除即可,最终形成图形为螺旋线. 关于 ...

  6. 简单几何(凸包) POJ 1696 Space Ant

    题目传送门 题意:一个蚂蚁一直往左边走,问最多能走多少步,且输出路径 分析:就是凸包的变形题,凸包性质,所有点都能走.从左下角开始走,不停排序.有点纠结,自己的凸包不能AC.待理解透凸包再来写.. 好 ...

  7. poj 1696 Space Ant (极角排序)

    链接:http://poj.org/problem?id=1696 Space Ant Time Limit: 1000MS   Memory Limit: 10000K Total Submissi ...

  8. 补充一下我对 POJ 3273 的理解,这肯定是我一生写的最多的题解。。。

    题目:http://poj.org/problem?id=3273 当分成的组数越多,所有组的最大值就会越小或不变,这一点不难证明:    如果当前分成了group组,最大值是max,那么max的这一 ...

  9. POJ 1696 Space Ant(点积的应用)

    Space Ant 大意:有一仅仅蚂蚁,每次都仅仅向当前方向的左边走,问蚂蚁走遍全部的点的顺序输出.開始的点是纵坐标最小的那个点,開始的方向是開始点的x轴正方向. 思路:从開始点開始,每次找剩下的点中 ...

随机推荐

  1. 【技巧】Java工程中的Debug信息分级输出接口

    也许本文的标题你们没咋看懂.但是,本文将带大家领略输出调试的威力. 灵感来源 说到灵感,其实是源于笔者在修复服务器的ssh故障时的一个发现. 这个学期初,同袍(容我来一波广告产品页面,同袍官网)原服务 ...

  2. Mego开发文档 - 基本保存操作

    基本保存操作 在Mego中没有更改跟踪,也就是说所有的新增.更新及删除都需要开发者自行判断.Mego会最为实际的将各个数据操作提交给数据库并执行. 添加数据 using (var db = new O ...

  3. 用C#(.NET Core) 实现简单工厂和工厂方法模式

    本文源自深入浅出设计模式. 只不过我是使用C#/.NET Core实现的例子. 前言 当你看见new这个关键字的时候, 就应该想到它是具体的实现. 这就是一个具体的类, 为了更灵活, 我们应该使用的是 ...

  4. hadoop2.6.0实践:003 检查hadoop是否可用

    start-dfs.sh start-yarn.sh 1.检查hdfs hdfs dfs -ls / http://localhost:50070 2.运行例子程序 hdfs dfs -ls / hd ...

  5. maven常见问题处理(3-2)maven打包时跳过测试的几个方法

    运行mvn install时跳过Test方法一:<project> [...] <build> <plugins> <plugin> <group ...

  6. Bootstrap 栅格系统简单整理

    Bootstrap内置了一套响应式.移动设备优先的流式栅格系统,随着屏幕设备或视口(viewport)尺寸的增加,系统会自动分为最多12列. 总结一下我近期的学习Bootstrap的一些理解: 一.. ...

  7. android webview重定向 返回按钮死循环问题修改

    当HTML有重定向的时候,回退时会不断往跳转进入死循环.尝试修改webview缓存加载策略以后,不起作用.在网上查阅资料以后,跟 shouldOverrideUrlLoading的返回值为true还是 ...

  8. HDU1028【母函数】

    题目:给你数n,问n可以有哪些组成方案(这些n的数字个数不超过n),母函数模板题 #include <cstdio> #include <cstring> #include & ...

  9. codeforces 761B Dasha and friends

    https://vjudge.net/problem/CodeForces-761B 题意: 有一个圆形跑道,上面有若干个障碍,分别给出两个人距离障碍的距离,问这两个人是否是在同一个跑道上跑步(我是这 ...

  10. 学习React系列(一)——React.Component 生命周期

    挂载中(只执行一次) 以下方法在组件实例正被创建和插入到DOM中时调用 constructor()一般用于初始化state和方法的this绑定 componentWillMount() render( ...