思路:枚举四边墙的门的中点,与终点连成一条线段,判断与其相交的线段的个数。最小的加一即为答案。

我是傻逼,一个数组越界调了两个小时。

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<math.h>
  4. #include<iostream>
  5. using namespace std;
  6. const int N=;
  7. const double eps=1e-;
  8. int sgn(double x){
  9. if(fabs(x)<eps) return ;
  10. if(x>) return ;
  11. return -;
  12. }
  13. struct point{
  14. double x,y;
  15. point(){}
  16. point(double x_,double y_){
  17. x=x_,y=y_;
  18. }
  19. point operator -(const point &b)const{
  20. return point(x-b.x,y-b.y);
  21. }
  22. double operator *(const point &b)const{
  23. return x*b.x+y*b.y;
  24. }
  25. double operator ^(const point &b)const{
  26. return x*b.y-y*b.x;
  27. }
  28. }po[N];
  29. struct line{
  30. point s,e;
  31. line(){}
  32. line(point s_,point e_){
  33. s=s_,e=e_;
  34. }
  35. }li[N];
  36. double cal(point p0,point p1,point p2){//叉积
  37. return (p1-p0)^(p2-p0);
  38. }
  39. int xj(line a,line b){//判断两线段是否相交
  40. point A=a.s,B=a.e,C=b.s,D=b.e;
  41. return
  42. max(A.x,B.x)>=min(C.x,D.x) &&
  43. max(C.x,D.x)>=min(A.x,B.x) &&
  44. max(A.y,B.y)>=min(C.y,D.y) &&
  45. max(C.y,D.y)>=min(A.y,B.y) &&
  46. sgn(cal(C,A,B))*sgn(cal(D,A,B))<= &&
  47. sgn(cal(A,C,D))*sgn(cal(B,C,D))<=;
  48. }
  49. int p[][];
  50. int main(){
  51. int n,i,j,js;
  52. double x1,y1,x2,y2;
  53. while(~scanf("%d",&n)){
  54. memset(p,,sizeof(p));js=;
  55. for(i=;i<=n;i++){
  56. scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
  57. p[(int)x1][(int)y1]=p[(int)x2][(int)y2]=;
  58. li[i]=line(point(x1,y1),point(x2,y2));
  59. }
  60. scanf("%lf%lf",&x1,&y1);
  61. point P=point(x1,y1);
  62. p[][]=;
  63. p[][]=;
  64. p[][]=;
  65. p[][]=;
  66. int x0,y0;
  67. for(y0=,i=;i<=;i++){
  68. if(p[][i]){
  69. po[++js]=point(,(i+y0)/2.0);
  70. y0=i;
  71. }
  72. }
  73. for(x0=,i=;i<=;i++){
  74. if(p[i][]){
  75. po[++js]=point((i+x0)/2.0,);
  76. x0=i;
  77. }
  78. }
  79. for(y0=,i=;i<=;i++){
  80. if(p[][i]){
  81. po[++js]=point(,(i+y0)/2.0);
  82. y0=i;
  83. }
  84. }
  85. for(x0=,i=;i<=;i++){
  86. if(p[i][]){
  87. po[++js]=point((i+x0)/2.0,);
  88. x0=i;
  89. }
  90. }
  91. int ans=;
  92. for(i=;i<=js;i++){
  93. line L=line(P,po[i]);
  94. int cnt=;
  95. for(j=;j<=n;j++){
  96. if(xj(L,li[j])){
  97. cnt++;
  98. }
  99. }
  100. if(cnt<ans) ans=cnt;
  101. }
  102. printf("Number of doors = %d\n",ans+);
  103. }
  104. return ;
  105. }

POJ 1066 Treasure Hunt【线段相交】的更多相关文章

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

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

  2. poj 1066 Treasure Hunt 线段相交

    题目链接 题目描述 一个正方形房间被分成若干个小室,宝藏在其中某一点.现可炸开任意一堵墙壁的中点位置.问至少要炸开多少堵墙才能从外面到达宝藏所在地. 思路 (很巧妙,没想到) 直接枚举墙壁与正方形外壁 ...

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

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

  4. poj 1066 Treasure Hunt (Geometry + BFS)

    1066 -- Treasure Hunt 题意是,在一个金字塔中有一个宝藏,金字塔里面有很多的墙,要穿过墙壁才能进入到宝藏所在的地方.可是因为某些原因,只能在两个墙壁的交点连线的中点穿过墙壁.问最少 ...

  5. POJ 1066 Treasure Hunt (线段相交)

    题意:给你一个100*100的正方形,再给你n条线(墙),保证线段一定在正方形内且端点在正方形边界(外墙),最后给你一个正方形内的点(保证不再墙上) 告诉你墙之间(包括外墙)围成了一些小房间,在小房间 ...

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

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

  7. POJ 1066 Treasure Hunt(计算几何)

    题意:给出一个100*100的正方形区域,通过若干连接区域边界的线段将正方形区域分割为多个不规则多边形小区域,然后给出宝藏位置,要求从区域外部开辟到宝藏所在位置的一条路径,使得开辟路径所需要打通的墙壁 ...

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

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

  9. POJ 1066 Treasure Hunt --几何,线段相交

    题意: 正方形的房子,给一些墙,墙在区域内是封闭的,给你人的坐标,每穿过一道墙需要一把钥匙,问走出正方形需要多少把钥匙. 解法: 因为墙是封闭的,所以绕路也不会减少通过的墙的个数,还不如不绕路走直线, ...

随机推荐

  1. 分享50款 Android 移动应用程序图标【上篇】

    在这个移动程序流行的时代,持续增长的应用程序经济充满了商业机遇.任何对应用程序设计感兴趣的人,将会喜欢上这里的50个独特的 Android 应用程序图标.这些例子中的图标能够让应用程序的设计更具吸引力 ...

  2. swift学习笔记之-协议

    //协议(Protocols) import UIKit /*协议(Protocols) 1.协议定义了一个蓝图,规定了用来实现某一特定任务或者功能的方法.属性,以及其他需要的东西 2.类.结构体或枚 ...

  3. spring(4)——自动装配

    set注入和构造注入有时在做配置时比较麻烦.所以框架为了提高开发效率,提供自动装配功能,简化配置.spring框架式默认不支持自动装配的,要想使用自动装配需要修改spring配置文件中<bean ...

  4. C/C++ 一些常用的运算符

    算数运算符 语法 解释说明举例 a + b 加法(求和)1+1..2+2..   2.5+2.5..等等 a - b 减法(求差)5 - 2.. a * b 乘法(求积)2 * 5 a / b 除法( ...

  5. SharePoint 2013 使用 PowerShell 更新用户

    在SharePoint开发中,经常会遇到网站部署,然而,当我们从开发环境,部署到正式环境以后,尤其是备份还原,所有用户组的用户,还依然是开发环境的,这时,我们就需要用PowerShell更新一下: P ...

  6. 使用Javascript来编写贪食蛇(零基础)

      引用的东西都很基础,注释也很多,这里就不多说了. <head> <meta http-equiv="Content-Type" content="t ...

  7. 如何去定义一个jquery插件

    扩展jquery的时候.最核心的方法是以下两种: $.extend(object) 可以理解为jquery添加一个静态方法 $.fn.extend(object) 可以理解为jquery实例添加一个方 ...

  8. iOS中使用 Reachability 检测网络

    iOS中使用 Reachability 检测网络 内容提示:下提供离线模式(Evernote).那么你会使用到Reachability来实现网络检测.   写本文的目的 了解Reachability都 ...

  9. iOS 更改webView文字颜色丶文字大小丶背景色的方法

    在webView的delegate回调方法    - (void)webViewDidFinishLoad:(UIWebView *)webView;中写上一下语句即可 //字体大小 [webView ...

  10. 【代码笔记】iOS-竖排文字

    一,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. ...