这题是明显的TU包变形。

使用卷包裹法可解,而且是必定可以经过所有点的。直观可知,当经过某点后,相当于把之前的点抹去,求剩下点的TU包,递归下去,也就能把点全部经过了。

于是,只需把经过的点标记一下就可以了。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <queue>
  5. #include <cmath>
  6.  
  7. using namespace std;
  8. const double inf=10000000;
  9. const double eps=0.00000001;
  10. struct point {
  11. double x,y;
  12. int num;
  13. }p[60];
  14.  
  15. bool vis[60];
  16. queue<int>que;
  17. struct vect{
  18. double x,y;
  19. };
  20.  
  21. double dist(point a,point b){
  22. return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
  23. }
  24.  
  25. double cross(point a,point b,point c,point d){
  26. return (a.x-b.x)*(c.y-d.y)-(a.y-b.y)*(c.x-d.x);
  27. }
  28.  
  29. int n;
  30. int main(){
  31. int t;
  32. scanf("%d",&t); double a,b;
  33. while(t--){
  34. scanf("%d",&n);
  35. point start; start.x=inf; start.y=inf; int dep;
  36. for(int i=0;i<n;i++){
  37. scanf("%d%lf%lf",&p[i].num,&p[i].x,&p[i].y);
  38. if(p[i].y<start.y){
  39. start.x=p[i].x; start.y=p[i].y; start.num=p[i].num;
  40. dep=i;
  41. }
  42. else if(p[i].y==start.y){
  43. if(p[i].x<start.x){
  44. start.x=p[i].x; start.num=p[i].num;
  45. dep=i;
  46. }
  47. }
  48. }
  49. // cout<<start.x<<' '<<start.y<<endl;
  50. point last; last.x=0; last.y=start.y;
  51. que.push(start.num);
  52. memset(vis,false,sizeof(vis));
  53. vis[dep]=true; point tmp;
  54. while(true){
  55. bool flag=false;
  56. for(int i=0;i<n;i++){
  57. if(vis[i]==false){
  58. if(cross(start,last,p[i],start)>=0){
  59. tmp=p[i];
  60. dep=i;
  61. flag=true;
  62. break;
  63. }
  64. }
  65. }
  66. // cout<<dep<<"YES"<<endl;
  67. if(!flag) break;
  68. for(int i=0;i<n;i++){
  69. if(vis[i]==false){
  70. if(cross(start,last,p[i],start)<0) continue;
  71. double res=cross(tmp,start,p[i],start);
  72. if(res<0){
  73. tmp=p[i];
  74. dep=i;
  75. }
  76. else if(res==0){
  77. if(dist(p[i],start)+eps<dist(tmp,start)){
  78. tmp=p[i];
  79. dep=i;
  80. }
  81. }
  82. }
  83. }
  84. que.push(tmp.num);
  85. //cout<<dep<<endl;
  86. vis[dep]=true;
  87. last=start;
  88. start=tmp;
  89. }
  90. printf("%d",n);
  91. for(int i=0;i<n;i++){
  92. printf(" %d",que.front());
  93. que.pop();
  94. }
  95. printf("\n");
  96. }
  97. return 0;
  98. }

  

POJ 1696的更多相关文章

  1. poj 1696 叉积理解

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

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

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

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

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

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

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

  5. POJ 1696 Space Ant --枚举,模拟,贪心,几何

    题意: 有很多点,从最右下角的点开始走起,初始方向水平向右,然后以后每步只能向左边走,问最多能走多少个点. 解法: 贪心的搞的话,肯定每次选左边的与它夹角最小的点,然后走过去. 然后就是相当于模拟地去 ...

  6. POJ 1696 Space Ant 【极角排序】

    题意:平面上有n个点,一只蚂蚁从最左下角的点出发,只能往逆时针方向走,走过的路线不能交叉,问最多能经过多少个点. 思路:每次都尽量往最外边走,每选取一个点后对剩余的点进行极角排序.(n个点必定能走完, ...

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

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

  8. POJ 1696 Space Ant(极角排序)

    Space Ant Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2489   Accepted: 1567 Descrip ...

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

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

  10. poj 1696 Space Ant 极角排序

    #include<cstdio> #include<cstring> #include<cmath> #include<iostream> #inclu ...

随机推荐

  1. U32670 小凯的数字 数学

    这是洛谷一个比赛中的一道题,和去年NOIP D1T1挺像.我看了一眼之后想“这不是小学奥数吗?求一个数字和就好了呀”...然后,60,剩下T了,gg. 只好看正解,但是一脸懵逼???然后看了证明,c* ...

  2. 一段时间加载的js函数

    <html><head><meta charset="utf8"><script type="text/javascript&q ...

  3. 利用python+tkinter开发一个点名软件

    最近上课学生多名字记不住,名册忘记了带,要点名怎么办,好久没有写代码了,于是自己写了个点名软件,记录下吧,第一次接触TK也不是太熟悉,写的不太好,记录下源代码 以后遇到要写桌面软件还是可以耍耍的. t ...

  4. SpringCloud学习 什么是微服务(一)

    关于SpringCloud,我是看了周老师的<SpringCloud与Docker微服务架构实战>之后才有了一点了解,做下记录,以供后期学习.本人知识有限,如有不对,欢迎批评 1.什么是单 ...

  5. java.util.concurrent常用类(CountDownLatch,Semaphore,CyclicBarrier,Future)

    CyclicBarrier CyclicBarrier是用来一个关卡来阻挡住所有线程,等所有线程全部执行到关卡处时,再统一执行下一步操作.假设一个场景:每个线程代表一个跑步运动员,当运动员都准备好后, ...

  6. android service--delphixe 10.3

    开发中的陷阱: 1. 别放什么 *.wav文件,这个 服务窗口不能随便放东西,不然铁定出现意想不到的结果,比如 无法运行,因为没 ui界面,随意都不知是啥问题. 2. 不能加载 datamodule ...

  7. Stick ------ 剪枝神题

    这个是自己剪得 , 我感觉已经很不错了  但是不知道哪里出了问题  一直  超时 // 根据所给答案 和 题目要求 最直观的就可以有剪枝的地方 而且 剪枝剪得越早 就越省时省力 // 好的思路也可以省 ...

  8. python 13:数字列表统计方法(min(list)、max(list)、sum(list))

    numbers = list(range(1,11)) print(numbers) print(min(numbers)) #获得列表最小值 print(max(numbers)) #获得列表最大值 ...

  9. POJ 3253 STL优先队列

    题目大意:FJ需要修补牧场的围栏,他需要 N 块长度为 Li 的木头(N planks of woods).开始时,FJ只有一块无限长的木板,因此他需要把无限长的木板锯成 N 块长度 为 Li 的木板 ...

  10. PHP序列化 反序列化

    序列化是将变量转换为可保存或传输的字符串的过程:反序列化就是在适当的时候把这个字符串再转化成原来的变量使用.这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性. 1. serialize和 ...