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. https://google-developers.appspot.com/chart/

    https://google-developers.appspot.com/chart/

  2. Message,MessageQueue,Looper,Handler详解

    Message,MessageQueue,Looper,Handler详解   一.几个关键概念 1.MessageQueue:是一种数据结构,见名知义,就是一个消息队列,存放消息的地方.每一个线程最 ...

  3. VS2012简单的使用感受+插件推荐

    VS2012简单的使用感受+插件推荐http://www.cnblogs.com/tangge/archive/2013/03/12/2955367.html

  4. Edius 安装 looks插件整理

    需要安装looks插件到指定目录,在后面桥接时选择该目录. 包括安装looksbuilder插件.

  5. 简单验证码识别 tessnet2

    今天突然间对识别验证码感兴趣,于是网上搜了一下 最简单的是引用tessnet2.dll,然后通过它来识别,代码如下 private void button1_Click(object sender, ...

  6. SSDP 简单服务发现协议

    http://blog.csdn.net/lilypp/article/details/6631951

  7. JSP的执行过程及其异常处理机制

    1.JSP的执行过程     虽然JSP感觉上很像一般的HTML网页,但事实上它是以Servlet的形式被运行的.因为JSP文件在第一次运行的时候会先解释成Servlet源文件,然后编译成Servle ...

  8. 大规模视觉识别挑战赛ILSVRC2015各团队结果和方法 Large Scale Visual Recognition Challenge 2015

    Large Scale Visual Recognition Challenge 2015 (ILSVRC2015) Legend: Yellow background = winner in thi ...

  9. beej's 网络编程 打包数据pack data

    7.4. Serialization—How to Pack Data It's easy enough to send text data across the network, you're fi ...

  10. Crypto API加密通信流程

    应用程序使用Crypto API进行加密通信的一般步骤如下: 1,include wincrypt.h 2,调用CryptAcquireContext()获得某个CSP模块中的密钥容器(key con ...