题意:给出一个1000*1000大小的矩阵,里面有若干圆,表示障碍物,现在要找出从左边到右边的一条通路,输出入口和出口的坐标,如果有多答案,输出y值最大的答案。

  分析:从与上面相连的圆开始dfs,每次找与之相交的圆作为dfs的路径,如果能访问到下面,那么左边和右边肯定是不连通的;否则,连通。并且在dfs的时候更新y值最大的答案。

  具体见代码:

  1. #include <stdio.h>
  2. #include <algorithm>
  3. #include <string.h>
  4. #include <set>
  5. #include <math.h>
  6. using namespace std;
  7. const int N = + ;
  8. const int inf = 2e9;
  9. typedef long long ll;
  10. typedef pair<int,int> pii;
  11.  
  12. int n;
  13. int vis[N];
  14. struct circle
  15. {
  16. int x,y,r;
  17. void read()
  18. {
  19. scanf("%d%d%d",&x,&y,&r);
  20. }
  21. }c[N];
  22.  
  23. bool can(circle a,circle b)
  24. {
  25. double dx = a.x - b.x;
  26. double dy = a.y - b.y;
  27. double d = sqrt(dx*dx+dy*dy);
  28. return d <= a.r + b.r;
  29. }
  30.  
  31. double ansL = , ansR = ;
  32. void update(int u)
  33. {
  34. if(c[u].x <= c[u].r)
  35. {
  36. double t = sqrt(c[u].r*c[u].r - c[u].x*c[u].x);
  37. double pos = c[u].y - t;
  38. ansL = min(ansL, pos);
  39. }
  40. if(c[u].x + c[u].r >= )
  41. {
  42. double tt = 1000.0 - c[u].x;
  43. double t = sqrt(c[u].r*c[u].r - tt*tt);
  44. double pos = c[u].y - t;
  45. ansR = min(ansR, pos);
  46. }
  47. }
  48.  
  49. bool dfs(int u)
  50. {
  51. vis[u] = ;
  52. if(c[u].y <= c[u].r) return false;
  53. update(u);
  54. for(int i=;i<=n;i++)
  55. {
  56. if(!vis[i] && can(c[u], c[i]))
  57. {
  58. if(!dfs(i)) return false;
  59. }
  60. }
  61. return true;
  62. }
  63.  
  64. void solve()
  65. {
  66. ansL = , ansR = ;
  67. memset(vis,,sizeof(vis));
  68. for(int i=;i<=n;i++)
  69. {
  70. if(!vis[i] && c[i].y + c[i].r >= )
  71. {
  72. if(!dfs(i))
  73. {
  74. puts("IMPOSSIBLE");
  75. return ;
  76. }
  77. }
  78. }
  79. printf("0.00 %.2f 1000.00 %.2f\n",ansL,ansR);
  80. }
  81.  
  82. int main()
  83. {
  84. while(scanf("%d",&n) == )
  85. {
  86. for(int i=;i<=n;i++) c[i].read();
  87. solve();
  88. }
  89. return ;
  90. }

UVA 11853 Paintball ——(dfs+圆交判定)的更多相关文章

  1. UVA - 11853 Paintball(dfs)

    UVA - 11853 思路:dfs,从最上面超过上边界的圆开始搜索,看能不能搜到最下面超过下边界的圆. 代码: #include<bits/stdc++.h> using namespa ...

  2. UVA 11853 - Paintball 战场(dfs)

    题意:有n个敌人,每个敌人有一个攻击范围,问你是否存在从西边到东边的路径,如果存在,输出入点和出点最靠北的坐标. 把每个敌人看出一个圆,从上往下跑dfs连通,如果到达底部,那么无解.要求出最靠北的坐标 ...

  3. UVA 11853 Paintball(几何数学+DFS)

    https://vjudge.net/problem/UVA-11853 根据题意描述,相当于在一个正方形中有若干个圆形障碍物,问是否能从左边界走到右边界.判断是否有解需要一点创造性的思维:不妨把正方 ...

  4. Uva - 11853 - Paintball

    先判断是否有解,从上到下dfs判断连通性,如果有从顶部到底部连通图,则无解.再判断最北的进出位置,从上边界开始遍历,沿途检查与边界相交的圆.这些圆的左边界的交点中最靠南边的一个就是所有的最北进入位置, ...

  5. CF 337D 求圆交

    题目链接:http://codeforces.com/problemset/problem/337/D 题意:就是一棵树上,有一些点被来自东方的神秘力量影响的,力量影响范围是d,为可能的力量源有几个. ...

  6. 计算几何(容斥原理,圆交):HDU 5120 Intersection

    Matt is a big fan of logo design. Recently he falls in love with logo made up by rings. The followin ...

  7. HDU 3264 Open-air shopping malls ——(二分+圆交)

    纯粹是为了改进牛吃草里的两圆交模板= =. 代码如下: #include <stdio.h> #include <algorithm> #include <string. ...

  8. Intersection(HDU5120 + 圆交面积)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5120 题目: 题意: 求两个圆环相交的面积. 思路: 两个大圆面积交-2×大圆与小圆面积交+两小圆面 ...

  9. HDU 3467 Song of the Siren(圆交)

    Problem Description In the unimaginable popular DotA game, a hero Naga Siren, also known as Slithice ...

随机推荐

  1. PIVOT就是行转列,UNPIVOT就是列传行

    PIVOT通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列值执行聚合.UNPIVOT与PIVOT执行相反的操作,将表值表达式的列转换为列值. 通 ...

  2. spring AOP 代理机制、执行过程、四种实现方式及示例详解

    1.加载过程 spring首先检测配置文件中的代理配置,然后去加载bean; 如果配置文件中没有配置代理,自然代理不会生效,如果配置了代理,但是代理还没有生效,那么有可能是加载顺序的问题,即在检测到代 ...

  3. xxx app 项目问题解决一览

    前话:作为人生旅途中的小记录 不同账号玩法限制       解决 <vn_rule>x</vn_rule> 6.调整下注筹码 **** 解决 不同账号的玩法限制    **** ...

  4. URL scheme添加以及查找方式

    2.1.1  添加URL Types URL Scheme是通过系统找到并跳转对应app的一类设置,通过向项目中的info.plist文件中加入URL types可使用第三方平台所注册的appkey信 ...

  5. VMware 虚拟机(linux)增加根目录磁盘空间

    今天查看学校的监控报修系统,不能访问了!!!系统运行很慢,用top命令查看发现内存使用率90%,用"df -h ”查看“/”目录使用率已达到80%,导致系统运行很慢.我用以下方法扩大根目录磁 ...

  6. vc里面怎样实现对话框之间传递变量的值

    Dialog1的类名是CDialog1, 头文件是dialog1.h.里有成员变量CString str1, str2;Dialog2的类名是CDialog2, 头文件是dialog2.h.里有成员变 ...

  7. 在Activity之间传递数据—获取Activity返回的数据

    在获取返回值时要注意的是打开Activity的方式,用方法:startActivityForResult 接收时,重写方法:onActivityResult 在子Activity中,写数据用方法:se ...

  8. Chapter 2 Open Book——1

    The next day was better… and worse. 明天会更好也会更坏. It was better because it wasn't raining yet, though t ...

  9. recursion 递归以及递归的缺点

    递归定义的算法有两部分: 递归基:直接定义最简单情况下的函数值: 递归步:通过较为简单情况下的函数值定义一般情况下的函数值. 应用条件与准则: (1)问题具有某种可借用的类同自身的子问题描述的性质: ...

  10. Git 开发新的功能分支

    软件开发中,总有无穷无尽的新的功能要不断的添加进来.添加一个新功能时,你肯定不希望因为一些实验性质的代码把主分支搞乱了, 所以每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并 ...