Problem Description

娜娜觉得钢琴很无趣了,就抛弃了钢琴,继续往前走,前面是一片湖,娜娜想到湖的对岸,可惜娜娜找了好久都没找到小桥和小船,娜娜也发现自己不是神仙,不能像八仙过海一样。正当娜娜发愁的时候,娜娜发现湖上面有一些石头!娜娜灵机一动,发现可以沿着石头跳吖跳吖,这样一直跳下去,或许能跳到对岸!

娜娜把所有石头的位置都告诉你,然后娜娜能跳的最远距离也是知道的~请聪明的你告诉娜娜,她能够顺利到达对岸吗?

为了能够顺利的表达每个石头的位置,假设娜娜正在x轴上,表示湖的一岸,湖的另一岸是直线y=y0,湖中的石头都以有序二元组<x,y>表示,我们可以假设湖是无穷宽,两个石头的距离为几何距离,石头与岸的距离为点到直线的距离。

Input

多组数据,首先是一个正整数t(t<=20)表示数据组数

对于每组数据首先是三个整数y0(1<=y0<=1000),n(0<=n<=1000),d(0<=d<=1000),分别表示湖的另一岸的位置、石头的个数、娜娜一次最远能跳的距离。

接下来是n行,每行是两个整数x,y(0<=|x|<=1000,0<y<y0)

Output

对于每组数据,如果娜娜能够到达湖的另一岸,先输出“YES”,再输出一个整数,表示娜娜最少要跳多少次才能到达另一岸,

如果娜娜不能到达湖的另一岸,先输出“NO”,再输出一个整数,表示娜娜距离湖的另一岸最近的距离。(注意大小写)

Sample Input

2
4 3 1
0 1
0 2
0 3
6 3 2
0 1
1 2
2 3

Sample Output

YES
4
NO
3

Hint

样例一,从x轴->(0,1)->(0,2)->(0,3)->对岸,总共跳4步,输出4

样例二,从x轴->(0,1)->(1,2)->(2,3),此时距离对岸的距离为3,最大跳跃距离为2,无法到达对岸,故输出3

题意:以x轴为岸,跳到对面岸yy上,给出多块石头在y=0和y=yy之间,有石头就可以站,每次跳有距离的限制,问是否能到达对岸,若不行,距离对岸多远?

思路:广搜,石头才1000个,以每个石头为索引,每块维护一个队列,就是此石头可以跳到的石头都入队。在BFS时只有起跳岸和到达岸两个地方需要特殊处理。起跳点直接忽略,以起跳岸一步可达的石头为起点来搜。在搜到每个点时判断是否可以一步到达对面岸。

 * Problem:
* Verdict: Accepted
* Submission Date: -- ::
* Time: 180MS
* Memory: 1984KB
*/
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int N=;
int yy, n, d;
bool vis[N]; struct node
{
int num;
int x,y;
}a[N]; vector< vector< node > > vect;
deque< node > que;
int cal()
{
que.clear();
int cnt=, up=;
for(int i=; i<n; i++)//直接以第一个队列为起点,即起跳岸一步可达之石
{
if(a[i].y<=d)
{
up=max(up,a[i].y);
que.push_back( a[i] );
vis[a[i].num]=; //已经浏览过
cnt=;
}
} while(!que.empty())//BFS过程
{
cnt++;
int siz=que.size(); for(int i=; i<siz; i++) //每个点
{
node tmp=que.front();
for(int j=; j<vect[tmp.num].size(); j++) //可达的点
{
node q=vect[tmp.num][j];
if(q.y+d>=yy) //已到
{
printf("YES\n%d\n",cnt+);
return -;
}
else if(vis[q.num]==false)
{
que.push_back(q);
vis[q.num]=;
up=max(up,q.y); //可达的点,的最大值
}
}
que.pop_front();
}
}
return up;
} double dis(node a, node b)//求距离
{
return sqrt( (b.y-a.y)*(b.y-a.y)+(b.x-a.x)*(b.x-a.x)) ;
} int pre()//此石头可达的石头都入队,注:只往上跳,或横跳,不往下跳
{
vect.clear();
vector< node > tmp;
for(int i=; i<n; i++)
{
vect.push_back(tmp);
for(int j=; j<n; j++)
{
if(a[i].x==a[j].x && a[i].y==a[j].y)
continue;
if( a[j].y>=a[i].y && dis(a[j],a[i])<=d )
{
vect[i].push_back(a[j]);
}
}
}
} int main()
{
// freopen("e://input.txt", "r", stdin);
int t;
vector<int> tmp;
cin>>t;
while(t--)
{
memset(vis,,sizeof(vis));
scanf("%d %d %d", &yy, &n, &d);
for(int i=; i<n; i++)
{
a[i].num=i;
scanf("%d%d",&a[i].x,&a[i].y);
} if(d>=yy)//一步即达
{
printf("YES\n1\n");
continue;
} pre(); //求每个石头队列 int ans=cal();
if(ans>-)
printf("NO\n%d\n",yy-ans);
} return ;
}

AC代码

acdream 1681 跳远女王(BFS,暴力)的更多相关文章

  1. B - 娜娜梦游仙境系列——跳远女王

    B - 娜娜梦游仙境系列——跳远女王 Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Other ...

  2. hdoj5024【BFS/暴力】

    题意: 在可以行走的区域内,只能转一次90度的弯,问你最长这条路可以多长. 思路: 我们可以看到 /* 123 8 4 765 */ 转90度的路径会是横竖,也就是1-3-5-7; 还有斜的:2-4- ...

  3. foj 2150 Fire Game(bfs暴力)

         Problem Description Fat brother and Maze are playing a kind of special (hentai) game on an N*M ...

  4. 并查集+bfs+暴力滑窗 Codeforces Round #356 (Div. 2) E

    http://codeforces.com/contest/680/problem/E 题目大意:给你一个n*n的图,然后图上的 . (我们下面都叫做‘点’)表示可以走,X表示不能走,你有如下的操作, ...

  5. Gym 101617J Treasure Map(bfs暴力)

    http://codeforces.com/gym/101617/attachments 题意:给出一个图,每个顶点代表一个金矿,每个金矿有g和d两个值,g代表金矿初始的金子量,d是该金矿每天的金子量 ...

  6. Codeforces 986A. Fair(对物品bfs暴力求解)

    解题思路: 1.对物品i bfs,更新每个小镇j获得每个物品i的最短距离. 2.时间复杂度o(n*k),满足2s的要求. 代码: #include <iostream> #include ...

  7. FZU--2188--过河(bfs暴力条件判断)

    过河I Time Limit: 3000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u Submit Status De ...

  8. ACdream 1195 Sudoku Checker (暴力)

    Sudoku Checker Time Limit: 2000/1000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others) Submi ...

  9. CodeForces - 1105D Kilani and the Game(多源BFS+暴力)

    题目: 给出一张游戏地图和每个玩家的位置,每次能移动的步数.p个玩家轮流移动占领地图中的格子(当格子已经被占领时就不能在占领了)在每个玩家都不能移动时游戏结束. 问在游戏结束后,每个玩家占领的格子的数 ...

随机推荐

  1. URAL 1517 Freedom of Choice(后缀数组,最长公共字串)

    题目 输出最长公共字串 #define maxn 200010 int wa[maxn],wb[maxn],wv[maxn],ws[maxn]; int cmp(int *r,int a,int b, ...

  2. iOS多线程的初步研究(九)-- dispatch源

    dispatch源(dispatch source)和RunLoop源概念上有些类似的地方,而且使用起来更简单.要很好地理解dispatch源,其实把它看成一种特别的生产消费模式.dispatch源好 ...

  3. 2013 ACM/ICPC Asia Regional Changsha Online - C Color Representation Conversion

    这个纯粹是一个细节题啊!!! 由于某个地方的浮点数比较写错了,WA了无数次啊…… 代码如下: #include<iostream> #include<cstdio> #incl ...

  4. UVA 11806 Cheerleaders dp+容斥

    In most professional sporting events, cheerleaders play a major role in entertaining the spectators. ...

  5. HDU 5596/BestCoder Round #66 (div.2) GTW likes math 签到

    GTW likes math  Memory Limit: 131072/131072 K (Java/Others) 问题描述 某一天,GTW听了数学特级教师金龙鱼的课之后,开始做数学<从自主 ...

  6. intelli IDEA node开发代码提示问题

    好几天没写代码了,今天新建一个项目,在引入rs这个文件系统模块时却没有关于这个模块的代码提示,着实令人恶心啊.还好最终解决了. 在没有代码提示的时候点击如下图标: 出现如下的界面,其中有个Edit u ...

  7. angularJS之$watch、$digest和$apply方法

    最近项目上使用了比较多的angular JS,一直都对它感觉比较陌生,总觉得有点反直觉,这段时间,准备下定决心弄明白,这个框架到底是怎么一回事,以及它的工作原理,生命周期……一点一点的啃完它吧.首先, ...

  8. Properties读取资源文件的四种方法

    package com.action; import java.io.InputStream; import java.util.Locale; import java.util.Properties ...

  9. Java学习笔记之:Java JDBC

    一.介绍 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用java语言编写 ...

  10. 针对安卓java入门:运算符和表达式

    逻辑运算符 &&和&判断是一样的,区别在于过程,&会把整个过程算一遍,&&一旦碰到false就不会往下