原题传送:http://poj.org/problem?id=1696

  利用叉积判断所有点与线段位置关系。下一棵植物A'的位置与蚂蚁位置A的连线得到线段AA',如果所有没有吃掉的植物均在AA'的左端,那么A'为应该吃的下一目标(如果多个植物在同一条直线上,先吃最近的一个)。因为无论坐标如何变化,在最有的状态下,蚂蚁总会把所有植物都吃掉,可以利用这个条件退出循环。

View Code

 1 #include <stdio.h>
 2 #include <math.h>
 3 #include <string.h>
 4 #include <vector>
 5 #define N 55
 6 using namespace std;
 7
 8 const double eps = 1e-8;
 9
10 struct node
11 {
12     double x, y;
13 }a[N];
14
15 bool vis[N];
16
17 double len(int i, int j)
18 {return sqrt((a[j].y - a[i].y) * (a[j].y - a[i].y) + (a[j].x - a[i].x) * (a[j].x - a[i].x));}
19
20 int main()
21 {
22     int i, j, t, n, id, aid;
23     double m;
24     vector<int> v;
25     scanf("%d", &t);
26     while(t --)
27     {
28         scanf("%d", &n);
29         v.clear();
30         memset(vis, false, sizeof vis);
31         for(m = 1000.0, i = 1; i <= n; i ++)
32         {
33             scanf("%d%lf%lf", &id, &a[i].x, &a[i].y);
34             if(a[i].y < m)
35             {
36                 m = a[i].y;
37                 aid = id;
38             }
39         }
40         v.push_back(aid);
41         vis[aid] = true;
42         if(n > 1)
43         {
44             while((int)v.size() != n)
45             {
46                 for(aid = -1, i = 1; i <= n; i ++)
47                 {
48                     if(!vis[i])
49                     {
50                         double x1 = a[i].x - a[v[v.size() - 1]].x;
51                         double y1 = a[i].y - a[v[v.size() - 1]].y;
52                         for(j = 1; j <= n; j ++)
53                         {
54                             if(!vis[j] && j != i)
55                             {
56                                 double x2 = a[j].x - a[v[v.size() - 1]].x;
57                                 double y2 = a[j].y - a[v[v.size() - 1]].y;
58                                 if(x1 * y2 - x2 * y1 < 0.0)
59                                     break;
60                             }
61                         }
62                         if(j == n + 1)
63                         {
64                             if(aid == -1 || (len(i, v[v.size() - 1]) < len(aid, v[v.size() - 1])))
65                                 aid = i;
66                         }
67                     }
68                 }
69                 v.push_back(aid);
70                 vis[aid] = true;
71             }
72             printf("%d", n);
73             for(i = 0; i < n; i ++)
74                 printf(" %d", v[i]);
75             putchar('\n');
76         }
77     }
78     return 0;
79 }

转载于:https://www.cnblogs.com/huangfeihome/archive/2012/11/03/2752561.html

POJ1696 Space Ant相关推荐

  1. POJ 1696 Space Ant(极角排序)【计算几何】

    ACM博客_kuangbin POJ 1696 Space Ant(极角排序) Space Ant Time Limit: 1000MS   Memory Limit: 10000K Total Su ...

  2. 【POJ - 1696】Space Ant (凸包,最小极角,排序)

    题干: The most exciting space discovery occurred at the end of the 20th century. In 1999, scientists t ...

  3. POJ - 1696 Space Ant(极角排序)

    题目链接:点击查看 题目大意:现在有一只特殊的蚂蚁,它会按照以下规则尽可能长的寻找路径: 不能回头 不能右转 只能逆时针行走 现在给出n个点,输出最长的路径 题目分析:既然是逆时针旋转,那么每次只能走 ...

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

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

  5. poj 1696 Space Ant

    大致题意: 一只蚂蚁,只会向左转,现在给出平面上很多个点,求解一种走法, 能使得蚂蚁能经过的点最多,每个顶点该蚂蚁只能经过一次,且所行走的路线不能发生交叉. 卷包裹法: 形象思维假想一根无限长的绳子, ...

  6. 计算几何----极角排序

    一.极角,极径,极轴,极点概念 在平面内取一个定点O,叫极点,引一条射线Ox,叫做极轴,再选定一个长度单位和角度的正方向(通常取逆时针方向). 对于平面内任何一点M,用ρ表示线段OM的长度(有时也用r ...

  7. kuangbin带你飞专题合集

    题目列表 [kuangbin带你飞]专题一 简单搜索 [kuangbin带你飞]专题二 搜索进阶 [kuangbin带你飞]专题三 Dancing Links [kuangbin带你飞]专题四 最短路 ...

  8. ACM计算几何题目推荐

    //第一期 计算几何题的特点与做题要领: 1.大部分不会很难,少部分题目思路很巧妙 2.做计算几何题目,模板很重要,模板必须高度可靠. 3.要注意代码的组织,因为计算几何的题目很容易上两百行代码,里面 ...

  9. POJ 计算几何入门题目推荐

      其实也谈不上推荐,只是自己做过的题目而已,甚至有的题目尚未AC,让在挣扎中.之所以推荐计算几何题,是因为,本人感觉ACM各种算法中计算几何算是比较实际的算法,在很多领域有着重要的用途(例如本人的专 ...

最新文章

  1. MySQL数据库环境使用全过程
  2. 第五章 python中正则表达式的使用
  3. asp.net request编码问题,(转载)
  4. 【剑指offer-Java版】43n个骰子的点数
  5. 使用代码生成建立可扩展序列化器(上)
  6. Scanner类的基本总结
  7. 使用JS 加入收藏,设为首页.
  8. 今天完成任务之SQL中len的使用
  9. 再不自动化就晚啦!优云教你4步打造基于CentOS的产品镜像
  10. 业务活动监视器(BAM)2.0带来的革命
  11. Bootstrap研究1-精巧的网格布局系统
  12. linux系统取代windows,Linux不可能取代Windows
  13. js保存网络图片至本地
  14. c语言贪吃蛇(简易版本含完整代码)
  15. 日志易:IT 运维分析及海量日志搜索的实践之路(上)
  16. VScode绘制波形图
  17. Unity_粒子系统特效制作_051
  18. kafka flush
  19. Qt Creator嵌入式python时报错error: ::hypot has not been declared
  20. 在宜家兼职收银员创收

热门文章

  1. linux通过管道的进程通信,linux 线程或进程之间通过管道通信(pipe)
  2. linux find d,Linux find命令傻瓜入门
  3. 微信sdk服务器支付文档,微信支付-普通下单开发者文档
  4. header+php+xiazai_php使用header函数实现文件下载
  5. 导致的死信的几种原因?
  6. 自动转换会出现的问题
  7. 048_String对象
  8. 485有时候从机接收指令没反应_原来微信发语音不好听,是你没掌握这2个技巧!快去试试吧...
  9. linux的du和df命令,du和df命令都是Linux系统的重要工具
  10. python redis集群_Python3 redis集群连接 (带密码验证)