题意: 正方形的房子,给一些墙,墙在区域内是封闭的,给你人的坐标,每穿过一道墙需要一把钥匙,问走出正方形需要多少把钥匙。

解法: 因为墙是封闭的,所以绕路也不会减少通过的墙的个数,还不如不绕路走直线,所以枚举角度,得出直线,求出与正方形内的所有墙交点最少的值,最后加1(正方形边界)。

代码:

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cstdlib>
  5. #include <cmath>
  6. #include <algorithm>
  7. #define Mod 1000000007
  8. #define pi acos(-1.0)
  9. #define eps 1e-8
  10. using namespace std;
  11. #define N 100017
  12.  
  13. struct Point{
  14. double x,y;
  15. Point(double x=, double y=):x(x),y(y) {}
  16. void input() { scanf("%lf%lf",&x,&y); }
  17. };
  18. typedef Point Vector;
  19. struct Circle{
  20. Point c;
  21. double r;
  22. Circle(){}
  23. Circle(Point c,double r):c(c),r(r) {}
  24. Point point(double a) { return Point(c.x + cos(a)*r, c.y + sin(a)*r); }
  25. void input() { scanf("%lf%lf%lf",&c.x,&c.y,&r); }
  26. };
  27. struct Line{
  28. Point p;
  29. Vector v;
  30. double ang;
  31. Line(){}
  32. Line(Point p, Vector v):p(p),v(v) { ang = atan2(v.y,v.x); }
  33. Point point(double t) { return Point(p.x + t*v.x, p.y + t*v.y); }
  34. bool operator < (const Line &L)const { return ang < L.ang; }
  35. };
  36. int dcmp(double x) {
  37. if(x < -eps) return -;
  38. if(x > eps) return ;
  39. return ;
  40. }
  41. template <class T> T sqr(T x) { return x * x;}
  42. Vector operator + (Vector A, Vector B) { return Vector(A.x + B.x, A.y + B.y); }
  43. Vector operator - (Vector A, Vector B) { return Vector(A.x - B.x, A.y - B.y); }
  44. Vector operator * (Vector A, double p) { return Vector(A.x*p, A.y*p); }
  45. Vector operator / (Vector A, double p) { return Vector(A.x/p, A.y/p); }
  46. bool operator < (const Point& a, const Point& b) { return a.x < b.x || (a.x == b.x && a.y < b.y); }
  47. bool operator >= (const Point& a, const Point& b) { return a.x >= b.x && a.y >= b.y; }
  48. bool operator <= (const Point& a, const Point& b) { return a.x <= b.x && a.y <= b.y; }
  49. bool operator == (const Point& a, const Point& b) { return dcmp(a.x-b.x) == && dcmp(a.y-b.y) == ; }
  50. double Dot(Vector A, Vector B) { return A.x*B.x + A.y*B.y; }
  51. double Length(Vector A) { return sqrt(Dot(A, A)); }
  52. double Angle(Vector A, Vector B) { return acos(Dot(A, B) / Length(A) / Length(B)); }
  53. double Cross(Vector A, Vector B) { return A.x*B.y - A.y*B.x; }
  54. Vector VectorUnit(Vector x){ return x / Length(x);}
  55. Vector Normal(Vector x) { return Point(-x.y, x.x) / Length(x);}
  56. double angle(Vector v) { return atan2(v.y, v.x); }
  57.  
  58. bool SegmentIntersection(Point A,Point B,Point C,Point D) {
  59. if(dcmp(Cross(C-A,B-A)*Cross(D-A,B-A)) <= && dcmp(Cross(A-C,D-C)*Cross(B-C,D-C)) <= ) return true;
  60. return false;
  61. }
  62. //data segment
  63. struct Seg{
  64. Point P[];
  65. }seg[];
  66. //data ends
  67.  
  68. int main()
  69. {
  70. int n,m,i,j;
  71. scanf("%d",&n);
  72. for(i=;i<=n;i++)
  73. seg[i].P[].input(), seg[i].P[].input();
  74. Point C,D;
  75. C.input();
  76. int Mini = Mod;
  77. double delta = *pi*0.001;
  78. for(i=;i<=;i++)
  79. {
  80. double ang = delta*i;
  81. D.x = 10000.0*cos(ang) + C.x;
  82. D.y = 10000.0*sin(ang) + C.y;
  83. int cnt = ;
  84. for(j=;j<=n;j++)
  85. if(SegmentIntersection(seg[j].P[],seg[j].P[],C,D))
  86. cnt++;
  87. Mini = min(Mini,cnt);
  88. }
  89. printf("Number of doors = %d\n",Mini+);
  90. return ;
  91. }

POJ 1066 Treasure Hunt --几何,线段相交的更多相关文章

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

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

  2. POJ 1066 Treasure Hunt【线段相交】

    思路:枚举四边墙的门的中点,与终点连成一条线段,判断与其相交的线段的个数.最小的加一即为答案. 我是傻逼,一个数组越界调了两个小时. #include<stdio.h> #include& ...

  3. [poj] 1066 Treasure Hunt || 判断直线相交

    原题 在金字塔内有一个宝藏p(x,y),现在要取出这个宝藏. 在金字塔内有许多墙,为了进入宝藏所在的房间必须把墙炸开,但是炸墙只能炸每个房间墙的中点. 求将宝藏运出城堡所需要的最小炸墙数. 判断点和直 ...

  4. poj 1066 Treasure Hunt (Geometry + BFS)

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. javaweb学习之Servlet开发(二)

    javaweb学习总结(六)--Servlet开发(二) 一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个< ...

  2. 性能分析之-- JAVA Thread Dump 分析综述

    性能分析之-- JAVA Thread Dump 分析综述       一.Thread Dump介绍 1.1什么是Thread Dump? Thread Dump是非常有用的诊断Java应用问题的工 ...

  3. Javascript一些小细节

    1.判断class存在 $(obj).hasClass('BTCheck_ON') $obj.attr('class')=="BTCheck_ON" 有时我们判断样式存在会写成第二 ...

  4. javascript --- 只继承于原型

    正如上次所述,,出于效率考虑,我们应该尽可能的将一些可重用的属性和方法添加到原型中去. 如果养成了这个好习惯,我们仅仅依靠原型就能顺利的完成继承关系的构建了. 毕竟采用new her()方法将her的 ...

  5. MySQL数据库的基本数据类型

    整数类型 数值型数据类型主要用来存储数字,包含的类型有: TINYINT.SMALLINT.MEDIUMINT. INT(INTEGER). BIGINT. 下面通过一个例子来查看各种类型的所占有的数 ...

  6. bash shell命令(2)

    在上篇<bash shell命令(1)>中,介绍了几种简单的linux shell命令,今天继续介绍bash shell命令 本文地址:http://www.cnblogs.com/arc ...

  7. 利用Handler访问网络数据

    废话不多白吃,代码如下: 1.MainActivity package com.yz.day11_22_handler;import android.app.Activity;import andro ...

  8. iOS UIWebView和网页的交互(OC中调执行JS)

    UIWebView和网页的交互(OC中调执行JS)- (void)viewDidLoad{[super viewDidLoad];// 1.webViewUIWebView *webView = [[ ...

  9. Mysql锁初步

    存储引擎 要了解mysql的锁,就要先从存储引擎说起. 常用存储引擎列表如下图所示: 最常使用的两种存储引擎: Myisam是Mysql的默认存储引擎.当create创建新表时,未指定新表的存储引擎时 ...

  10. Runtime(动态添加属性)

    下面通过一个实例展示一下Runtime(动态添加属性)的用法 下面对运行时添加属性用到的策略参数进行补充: 这样看来,前面的NSString* name用的策略是retain nonatomic就知道 ...