http://poj.org/problem?id=1066

题目大意:有n条线段 他们都在这个房间里   最后有一个点代表起始位置

现在想通过墙出去  他只能爆破每个房间的中点的门   问最少的门通过的

分析:   刚开始就想到暴力写   但是一想好麻烦   头都大了   最后还是暴力   我把边存错了 调试了好久  就过了

先找到每条线段(包括边界)与所有的线段之间的交点求出来   然后从左往右排下序  把中点存到一个结构体里(把边界的点特殊处理一下)

处理所有的中点   能直接相连的就置成1  否则就是INF     最后地杰斯特拉跑一边   把边缘的点比较一下就好

用G++ 交   c++的话  就把fabs改成abs就好  反正它本身就是整形

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4. #include<ctype.h>
  5. #include<math.h>
  6. #include<queue>
  7. #include<algorithm>
  8. #include<iostream>
  9.  
  10. using namespace std;
  11. #define N 2000
  12. const double ESP = 1e-;
  13. #define INF 0x3f3f3f3f
  14. #define memset(a,b) memset(a,b,sizeof(a))
  15.  
  16. int n;
  17.  
  18. struct Point
  19. {
  20. double x,y;
  21. int step;
  22. Point (double x=,double y=):x(x),y(y) {}
  23.  
  24. Point operator - (const Point &temp)const
  25. {
  26. return Point(x-temp.x,y-temp.y);
  27. }
  28. int operator * (const Point &temp)const
  29. {
  30. double t=(x*temp.y-y*temp.x);
  31. if(t>ESP)
  32. return ;
  33. if(fabs(t)<ESP)
  34. return ;
  35. return -;
  36. }
  37. };
  38.  
  39. struct node
  40. {
  41. Point A,B;
  42. node (Point A=,Point B=):A(A),B(B) {}
  43.  
  44. };
  45.  
  46. Point p[N],d[N];
  47. node a[N];
  48.  
  49. Point line(Point u1,Point u2,Point v1,Point v2)///求交点
  50. {
  51. Point ret=u1;
  52. double t=((u1.x-v1.x)*(v1.y-v2.y)-(u1.y-v1.y)*(v1.x-v2.x))/((u1.x-u2.x)*(v1.y-v2.y)-(u1.y-u2.y)*(v1.x-v2.x));
  53.  
  54. ret.x+=(u2.x-u1.x)*t;
  55. ret.y+=(u2.y-u1.y)*t;
  56.  
  57. return ret;
  58. }
  59.  
  60. int cmp(const void *aa,const void *bb)
  61. {
  62. struct Point *cc,*dd;
  63. cc=(struct Point *)aa;
  64. dd=(struct Point *)bb;
  65. if(cc->x!=dd->x)
  66. return cc->x-dd->x;
  67. else
  68. return cc->y-dd->y;
  69. }
  70.  
  71. int G[N][N];
  72.  
  73. void serch(int o)
  74. {
  75. for(int i=;i<=o;i++)
  76. {
  77. for(int j=;j<=o;j++)
  78. {
  79. if(i==j)
  80. continue;
  81. int flag=;
  82. for(int k=;k<n;k++)
  83. {
  84. int k1=fabs((d[i]-a[k].A)*(a[k].B-a[k].A)+(d[j]-a[k].A)*(a[k].B-a[k].A));
  85. int k2=fabs((a[k].A-d[j])*(d[i]-d[j])+(a[k].B-d[j])*(d[i]-d[j]));
  86. if(k1== && k2==)
  87. {
  88. flag=;
  89. break;
  90. }
  91. }
  92. if(flag==)
  93. G[i][j]=;
  94. }
  95. }
  96. }
  97.  
  98. int vis[N],dis[N];
  99.  
  100. void dji(int s,int o)
  101. {
  102. memset(vis,);
  103. for(int i=;i<=o;i++)
  104. dis[i]=G[s][i];
  105. for(int i=;i<=o;i++)
  106. {
  107. int Min=INF,dist;
  108. for(int j=;j<=o;j++)
  109. {
  110. if(!vis[j] && Min>dis[j])
  111. {
  112. Min=dis[j];
  113. dist=j;
  114. }
  115. }
  116. vis[dist]=;
  117. for(int j=;j<=o;j++)
  118. {
  119. dis[j]=min(dis[j],dis[dist]+G[dist][j]);
  120. }
  121. }
  122. }
  123.  
  124. int main()
  125. {
  126.  
  127. double x1,x2,y1,y2;
  128. while(scanf("%d",&n)!=EOF)
  129. {
  130.  
  131. double x,y;
  132. for(int i=; i<=n; i++)
  133. {
  134. scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2);
  135. a[i]=node(Point(x1,y1),Point(x2,y2));
  136. }
  137. n=n+;
  138. a[n++]=node(Point(,),Point(,));
  139. a[n++]=node(Point(,),Point(,));
  140. a[n++]=node(Point(,),Point(,));
  141. a[n++]=node(Point(,),Point(,));
  142.  
  143. scanf("%lf %lf",&x,&y);
  144. int o=;///中点的个数
  145. int h[N];///在边缘的点
  146. int aa=;///边缘点的个数
  147. for(int i=; i<n; i++)
  148. {
  149. memset(p,);
  150. int b=;
  151. for(int j=; j<n; j++)
  152. {
  153. if(i==j)
  154. continue;
  155. int k=fabs((a[i].B-a[j].A)*(a[j].B-a[j].A)+(a[i].A-a[j].A)*(a[j].B-a[j].A));
  156. int kk=fabs((a[j].B-a[i].A)*(a[i].B-a[i].A)+(a[j].A-a[i].A)*(a[i].B-a[i].A));
  157. if(k!= && kk!=)///如果两个线段相交 求交点
  158. {
  159. p[b++]=line(a[i].A,a[i].B,a[j].A,a[j].B);
  160. }
  161. }
  162. qsort(p,b,sizeof(p[]),cmp);///交点从左向右排序
  163.  
  164. for(int j=;j<b;j++)///每一条线段的中点
  165. {
  166. d[o]=Point((p[j].x+p[j-].x)/2.0,(p[j].y+p[j-].y)/2.0);
  167. if(d[o].x== || d[o].x== || d[o].y== || d[o].y==)///边界点
  168. {
  169. h[aa++]=o;
  170. }
  171. o++;
  172. }
  173. }
  174. d[o]=Point(x,y);///起始点
  175. for(int i=;i<=o;i++)
  176. {
  177. for(int j=;j<=o;j++)
  178. G[i][j]=INF;
  179. }
  180. serch(o);///判断这两个中点是否能直接相连
  181. dji(o,o);///最短路
  182. int Min=INF;
  183. for(int i=;i<aa;i++)
  184. {
  185. Min=min(Min,dis[h[i]]);
  186. }
  187. printf("Number of doors = %d \n",Min);
  188. }
  189. return ;
  190. }

Treasure Hunt--poj1066(最短路加判断线段的关系)的更多相关文章

  1. Revit API判断直线相交关系移动风管

    start )             );         )) )) );         XYZ xyz12 = lCurve1.Curve.get_EndPoint();         XY ...

  2. POJ 1066 Treasure Hunt(线段相交判断)

    Treasure Hunt Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4797   Accepted: 1998 Des ...

  3. POJ 1066 - Treasure Hunt - [枚举+判断线段相交]

    题目链接:http://poj.org/problem?id=1066 Time Limit: 1000MS Memory Limit: 10000K Description Archeologist ...

  4. POJ 1066 Treasure Hunt(相交线段&amp;&amp;更改)

    Treasure Hunt 大意:在一个矩形区域内.有n条线段,线段的端点是在矩形边上的,有一个特殊点,问从这个点到矩形边的最少经过的线段条数最少的书目,穿越仅仅能在中点穿越. 思路:须要巧妙的转换一 ...

  5. poj1066 Treasure Hunt【计算几何】

    Treasure Hunt Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8192   Accepted: 3376 Des ...

  6. POJ 1066--Treasure Hunt(判断线段相交)

    Treasure Hunt Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7857   Accepted: 3247 Des ...

  7. POJ_1556_The Doors_判断线段相交+最短路

    POJ_1556_The Doors_判断线段相交+最短路 Description You are to find the length of the shortest path through a ...

  8. POJ 2556 (判断线段相交 + 最短路)

    题目: 传送门 题意:在一个左小角坐标为(0, 0),右上角坐标为(10, 10)的房间里,有 n 堵墙,每堵墙都有两个门.每堵墙的输入方式为 x, y1, y2, y3, y4,x 是墙的横坐标,第 ...

  9. 简单几何(线段相交) POJ 1066 Treasure Hunt

    题目传送门 题意:从四面任意点出发,有若干障碍门,问最少要轰掉几扇门才能到达终点 分析:枚举入口点,也就是线段的两个端点,然后选取与其他线段相交点数最少的 + 1就是答案.特判一下n == 0的时候 ...

随机推荐

  1. checkbox设置复选框的只读效果不让用户勾选

    在Web开发中,有时候需要显示一些复选框(checkbox),表明这个地方是可以进行勾选操作的,但是有时候是只想告知用户"这个地方是可以进行勾选操作的"而不想让用户在此处勾选(比如 ...

  2. 洛谷 P2580 于是他错误的点名开始了

    题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 他会一边搓炉石一边点名以至于有一天他连续点到了某个同学两次,然后正好被路过的校长发现了然后就是一顿欧拉欧拉欧拉(详情请见已结束比赛CON900). ...

  3. 30行代码消费腾讯人工智能开放平台提供的自然语言处理API

    腾讯人工智能AI开放平台上提供了很多免费的人工智能API,开发人员只需要一个QQ号就可以登录进去使用. 腾讯人工智能AI开放平台的地址:https://ai.qq.com/ 里面的好东西很多,以自然语 ...

  4. SEO 第九章

    SEO第九章 本次课目标: 1.  外部优化之平台优化 2.  如何撰写SEO诊断方案 一.外部平台优化——百度系列平台 百度系列的平台都是属于百度自己的产品,排名都是比较高的,所以我们在做外部推广的 ...

  5. 安装 配置 IIS

    一  .找到    控制面板 ------  在程序和功能  -----打开或关闭window 功能 :这里可能要等一下 才会显示 . 二‘.找到  Internet信息服务 ,勾选大部分如下图:点击 ...

  6. strict说明

  7. CAD交互绘制文字(网页版)

    在CAD设计时,需要绘制文字,用户可以设置设置绘制文字的高度等属性. 主要用到函数说明: _DMxDrawX::DrawText 绘制一个单行文字.详细说明如下: 参数 说明 DOUBLE dPosX ...

  8. 浏览器title失去焦点时改变title

    document.addEventListener('visibilitychange', function() { var isHidden = document.hidden; if (isHid ...

  9. Java BufferedReader文件读取 带缓冲区的字符流

    package org.jimmy.autosearch2019.test; import java.io.BufferedReader; import java.io.FileInputStream ...

  10. QT+常见控件+tab Widget 和Stacked Widget

    首先:这里介绍以下tab Widget 和Stacked Widget 之间的区别和使用的方法: tab Widget控件可以直接的进行切换,Stacked Widget却不可以直接在界面上进行切换, ...