POJ1696 Space Ant
原题传送:http://poj.org/problem?id=1696
利用叉积判断所有点与线段位置关系。下一棵植物A'的位置与蚂蚁位置A的连线得到线段AA',如果所有没有吃掉的植物均在AA'的左端,那么A'为应该吃的下一目标(如果多个植物在同一条直线上,先吃最近的一个)。因为无论坐标如何变化,在最有的状态下,蚂蚁总会把所有植物都吃掉,可以利用这个条件退出循环。
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相关推荐
- POJ 1696 Space Ant(极角排序)【计算几何】
ACM博客_kuangbin POJ 1696 Space Ant(极角排序) Space Ant Time Limit: 1000MS Memory Limit: 10000K Total Su ...
- 【POJ - 1696】Space Ant (凸包,最小极角,排序)
题干: The most exciting space discovery occurred at the end of the 20th century. In 1999, scientists t ...
- POJ - 1696 Space Ant(极角排序)
题目链接:点击查看 题目大意:现在有一只特殊的蚂蚁,它会按照以下规则尽可能长的寻找路径: 不能回头 不能右转 只能逆时针行走 现在给出n个点,输出最长的路径 题目分析:既然是逆时针旋转,那么每次只能走 ...
- POJ 1696 Space Ant 极角排序(叉积的应用)
题目大意:给出n个点的编号和坐标,按逆时针方向连接着n个点,按连接的先后顺序输出每个点的编号. 题目思路:Cross(a,b)表示a,b的叉积,若小于0:a在b的逆时针方向,若大于0a在b的顺时针方向 ...
- poj 1696 Space Ant
大致题意: 一只蚂蚁,只会向左转,现在给出平面上很多个点,求解一种走法, 能使得蚂蚁能经过的点最多,每个顶点该蚂蚁只能经过一次,且所行走的路线不能发生交叉. 卷包裹法: 形象思维假想一根无限长的绳子, ...
- 计算几何----极角排序
一.极角,极径,极轴,极点概念 在平面内取一个定点O,叫极点,引一条射线Ox,叫做极轴,再选定一个长度单位和角度的正方向(通常取逆时针方向). 对于平面内任何一点M,用ρ表示线段OM的长度(有时也用r ...
- kuangbin带你飞专题合集
题目列表 [kuangbin带你飞]专题一 简单搜索 [kuangbin带你飞]专题二 搜索进阶 [kuangbin带你飞]专题三 Dancing Links [kuangbin带你飞]专题四 最短路 ...
- ACM计算几何题目推荐
//第一期 计算几何题的特点与做题要领: 1.大部分不会很难,少部分题目思路很巧妙 2.做计算几何题目,模板很重要,模板必须高度可靠. 3.要注意代码的组织,因为计算几何的题目很容易上两百行代码,里面 ...
- POJ 计算几何入门题目推荐
其实也谈不上推荐,只是自己做过的题目而已,甚至有的题目尚未AC,让在挣扎中.之所以推荐计算几何题,是因为,本人感觉ACM各种算法中计算几何算是比较实际的算法,在很多领域有着重要的用途(例如本人的专 ...
最新文章
- MySQL数据库环境使用全过程
- 第五章 python中正则表达式的使用
- asp.net request编码问题,(转载)
- 【剑指offer-Java版】43n个骰子的点数
- 使用代码生成建立可扩展序列化器(上)
- Scanner类的基本总结
- 使用JS 加入收藏,设为首页.
- 今天完成任务之SQL中len的使用
- 再不自动化就晚啦!优云教你4步打造基于CentOS的产品镜像
- 业务活动监视器(BAM)2.0带来的革命
- Bootstrap研究1-精巧的网格布局系统
- linux系统取代windows,Linux不可能取代Windows
- js保存网络图片至本地
- c语言贪吃蛇(简易版本含完整代码)
- 日志易:IT 运维分析及海量日志搜索的实践之路(上)
- VScode绘制波形图
- Unity_粒子系统特效制作_051
- kafka flush
- Qt Creator嵌入式python时报错error: ::hypot has not been declared
- 在宜家兼职收银员创收
热门文章
- linux通过管道的进程通信,linux 线程或进程之间通过管道通信(pipe)
- linux find d,Linux find命令傻瓜入门
- 微信sdk服务器支付文档,微信支付-普通下单开发者文档
- header+php+xiazai_php使用header函数实现文件下载
- 导致的死信的几种原因?
- 自动转换会出现的问题
- 048_String对象
- 485有时候从机接收指令没反应_原来微信发语音不好听,是你没掌握这2个技巧!快去试试吧...
- linux的du和df命令,du和df命令都是Linux系统的重要工具
- python redis集群_Python3 redis集群连接 (带密码验证)