[UVA11853]Paintball

算法入门经典第6章6-22(P175)

题目大意:有一个1000*1000的正方形战场,西南角坐标(0,0),西北角坐标(0,1000),有n个敌人,每个敌人处在(xi,yi),攻击范围为ri,要避开他们的攻击范围,求从最左边出发的最北边出发点及右边的最北边到达点。

试题分析:我们先判断是否能有方案,如何判断?将相交圆的圆心相连,看从交上边界的圆出发是否能到达与下边界相交的圆。然后再这个过程中如果看到与左/右边界相交的圆那么更新答案就好了。

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. #include<vector>
  5. #include<cmath>
  6. #include<queue>
  7. #include<stack>
  8. #include<algorithm>
  9. using namespace std;
  10.  
  11. inline int read(){
  12. int x=0,f=1;char c=getchar();
  13. for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
  14. for(;isdigit(c);c=getchar()) x=x*10+c-'0';
  15. return x*f;
  16. }
  17. const int MAXN=2001;
  18. const int INF=999999;
  19. int N,M;
  20. vector<int> vec[MAXN];
  21. struct data{
  22. double x,y,r;
  23. }cir[MAXN];
  24. bool vis[MAXN];
  25. double ansl,ansr;
  26. bool flag=false;
  27.  
  28. double dis(int a,int b){
  29. double x=cir[a].x-cir[b].x;
  30. double y=cir[a].y-cir[b].y;
  31. return sqrt(x*x+y*y);
  32. }
  33. bool DFS(int x){
  34. if(vis[x]||flag) return false;
  35. vis[x]=true;
  36. if(cir[x].x-cir[x].r<=0){
  37. flag=true;
  38. return true;
  39. }
  40. if (cir[x].y<=cir[x].r) ansl=min(ansl,cir[x].x-sqrt(cir[x].r*cir[x].r-cir[x].y*cir[x].y));
  41. if (cir[x].y+cir[x].r>=1000) {
  42. double k=1000-cir[x].y;
  43. ansr=min(ansr,cir[x].x-sqrt(cir[x].r*cir[x].r-k*k));
  44. }
  45. for(int i=0;i<vec[x].size();i++) DFS(vec[x][i]);
  46. return false;
  47. }
  48.  
  49. int main(){
  50. while(scanf("%d",&N)!=EOF){
  51. for(int i=1;i<=N;i++) vec[i].clear();
  52. ansl=ansr=1000.0; flag=false;
  53. for(int i=1;i<=N;i++){
  54. scanf("%lf",&cir[i].y);
  55. scanf("%lf",&cir[i].x);
  56. scanf("%lf",&cir[i].r);
  57. }
  58. for(int i=1;i<N;i++){
  59. for(int j=i+1;j<=N;j++){
  60. if(dis(i,j)<=cir[i].r+cir[j].r){
  61. vec[i].push_back(j);
  62. vec[j].push_back(i);
  63. }
  64. }
  65. }
  66. memset(vis,false,sizeof(vis));
  67. for(int i=1;i<=N;i++)
  68. if(cir[i].r+cir[i].x>=1000)
  69. if(DFS(i)) break;
  70. if(flag) printf("IMPOSSIBLE\n");
  71. else printf("%.2f %.2f %.2f %.2f\n",0.0,ansl,1000.0,ansr);
  72. }
  73. }

【DFS】Paintball(6-22)的更多相关文章

  1. 【第40套模拟题】【noip2011_mayan】解题报告【map】【数论】【dfs】

    目录:1.潜伏者 [map] 2.Hankson的趣味题[数论]3.mayan游戏[dfs] 题目: 1. 潜伏者(spy.pas/c/cpp)[问题描述]R 国和S 国正陷入战火之中,双方都互派间谍 ...

  2. Kattis - glitchbot 【DFS】

    Kattis - glitchbot [DFS] 题意 有一个机器人 刚开始在(0, 0),然后给出一个目标点,并且会给出一系列指令,但是其中会有一个指令是错误的.我们需要找出那个指令,并且改成正确的 ...

  3. HDU 6113 度度熊的01世界 【DFS】(2017"百度之星"程序设计大赛 - 初赛(A))

    度度熊的01世界 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  4. 【dfs】P1331 海战

    题目描述 在峰会期间,武装部队得处于高度戒备.警察将监视每一条大街,军队将保卫建筑物,领空将布满了F-2003飞机.此外,巡洋船只和舰队将被派去保护海岸线.不幸的是因为种种原因,国防海军部仅有很少的几 ...

  5. 【dfs】p1731 生日蛋糕

    1441:[例题2]生日蛋搞 [题目描述] 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体.设从下往上数第i(1≤i≤M)层蛋糕是半径为Ri, 高 ...

  6. 【dfs】LETTERS

    1212:LETTERS [题目描述] 给出一个roe×colroe×col的大写字母矩阵,一开始的位置为左上角,你可以向上下左右四个方向移动,并且不能移向曾经经过的字母.问最多可以经过几个字母. [ ...

  7. 洛谷P1605 迷宫【dfs】

    题目背景 迷宫 [问题描述] 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和 终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫 中移动有上下 ...

  8. 【dfs】BZOJ1703-[Usaco2007 Mar]Ranking the Cows 奶牛排名

    [题目大意] 农夫约翰有N(1≤N≤1000)头奶牛,每一头奶牛都有一个确定的独一无二的正整数产奶率.约翰想要让这些奶牛按产奶率从高到低排序,约翰已经比较了M(1≤M≤10000)对奶牛的产奶率,但他 ...

  9. 【DFS】BZOJ3522-[Poi2014]Hotel

    [题目大意] 给出一棵树,求三个节点使得它们两两之间的距离相等,问共有多少种可能性? [思路] 显然,这三个节点是关于一个中心点对称地辐射出去的. 枚举中心点,往它的各个子树跑Dfs.tmp[i]表示 ...

随机推荐

  1. eCharts_基于eCharts开发的一个多图表页面

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. MS16-032提权正确方法

    原版MS16-032提权会Spawn一个System Shell出来,只能通过Remote Desktop获取.这里修改exploit,直接反弹Shell.注意MS16-032依赖 thread ha ...

  3. Python第三方库SnowNLP(Simplified Chinese Text Processing)快速入门与进阶

    简介 github地址:https://github.com/isnowfy/snownlp SnowNLP是一个python写的类库,可以方便的处理中文文本内容,是受到了TextBlob的启发而写的 ...

  4. mongodb 学习笔记--- 基础知识

    1.mongodb的安装 (1) mac使用brew 安装就好 brew install mongodb (2) mkdir /data/db 作为mongodb默认的数据目录 并 sudo chow ...

  5. 设计模式之笔记--组合模式(Composite)

    组合模式(Composite) 定义 组合模式(Composite),将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性.       组合模式有 ...

  6. UVA - 796

    UVA- 796 /** 题意:给出一个图,然后看此图的存在的桥,并且输出是哪一个, 做法:Tarjan(不存在重边) **/ #include<iostream> #include< ...

  7. [PAT] 1140 Look-and-say Sequence(20 分)

    1140 Look-and-say Sequence(20 分)Look-and-say sequence is a sequence of integers as the following: D, ...

  8. Django 项目CRM总结

    0. 项目说明: 1. 销售自动分配客户资源: 给销售分配权重及承单数量,创建权重表,通过销售权重进行从大到小进行排序 以承单数循环添加到列表,承单数是多少列表添加就添加多少次 考虑到如果服务重启,或 ...

  9. vue利用watch侦听对象具体的属性 ~ 巧用计算属性computed做中间层

    有时候需要侦听某个对象具体的属性,可以按下面案例进行: <template> <div> <input type="text" v-model=&qu ...

  10. cocos2djs ctor init onEnter的区别

    cocos2d-html5 onEnter init ctor构造函数 ---js特有特性(和c++有点不一样 ctor 构造函数, new 一个对象的时候调用-----coco2d-js , 默认c ...