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

Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others)

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

题意:给出一张图,起点,终点,问是否能到达终点,如果能,输出最少的步数,如果不能,输出距离终点最近的点

解法:构图,由于只有1000个点,可以考虑邻接矩阵,两点距离小于等于d的连一条边,y<=d的点与起点连一条边(意味着可以从起点到达),y<=y0-d的点与终点连一条边(意味着可以到达终点),别忘了y0<=d的时候要给起点与终点连一条边(或者特判输出YES 1) 然后在图上跑bfs或者其余最短路算法,怎样记录不能到达的最近距离呢?当遍历到某一个点时,判断y坐标与y0的大小可以更新mindist=min(mindist,y0-y)。若最终不能到达终点,输出mindist即可。

note:最短路忘了怎么写了,再去学,就直接用搜索了。原先用dfs超时了,后来改用额,应该是广搜把,AC了。 。。

1.  先判断跳跃的距离是否d>=y0,如果成立就直接输出结果。

2.  如果不是,就先把能和起点相连的石子用数组mark标记为1,意为第一步。

3.  再把该石子和前面已经输入的石子相比,把能连在一起的用二维数组map连起来。

4.  之后搜索就是从1开始找满足当前步数的石子,再找能够连接的石子且下一个石子的步数必须小于当前步数no+1,才能把下一步的石子标记,如果找不到后继就结束。期间每找到一步,保存最近的距离dis。

5.  循环一遍找可以跳到终点的石子(y0-y[i]<=d),找标记不为0且最小的步数即为结果步数。如果没有满足的石子,就跳不到终点,最近距离就为dis。

 1 #include <stdio.h>
 2 #include <string.h>
 3
 4 int y0,n,d,map[1001][1001],x[1001],y[1001],mark[1001],way,sum,der;
 5
 6 int getDis(int i,int j)   //求两点的平方,用来和跳跃距离d*d比较
 7 {
 8     return (x[j]-x[i])*(x[j]-x[i])+(y[j]-y[i])*(y[j]-y[i]);
 9 }
10
11 void go(int no)    //从步数no=1开始查找
12 {
13     //printf("-%d\n",no);
14     int i,j,k=0;
15     for(i=0;i<n;i++)
16     {
17         if(mark[i]==no)     //是否满足当前步数
18         {
19             for(j=0;j<n;j++)
20             {
21                 if(map[i][j]==1&&(mark[j]==0||mark[j]>no+1))  //查找能够跳到的下一个石子,且跳跃步数要为0或者大于当前步数no+1
22                 {
23                     if(der>y0-y[j])                  //判断离终点最近的距离
24                         der=y0-y[j];
25                     mark[j]=no+1;
26                     k=1;
27                 }
28             }
29         }
30     }
31     if(k)               //存在下一个石子可以跳跃
32         go(no+1);
33 }
34
35 int main()
36 {
37     int t,i,j;
38     while(scanf("%d",&t)!=EOF)
39     {
40         while(t--)
41         {
42             scanf("%d %d %d",&y0,&n,&d);
43             way=0;
44             sum=1003;
45             der=y0;
46             if(y0<=d)                //终点比跳跃距离近
47             {
48                 sum=1;
49                 way=1;
50             }
51             memset(mark,0,sizeof(mark));
52             memset(map,0,sizeof(map));
53             for(i=0;i<n;i++)
54             {
55                 scanf("%d %d",&x[i],&y[i]);
56                 if(y[i]<=d)               //起点能跳到的石子
57                 {
58                     if(der>y0-y[i])
59                         der=y0-y[i];
60                     mark[i]=1;           //标记步数为1
61                 }
62                 for(j=0;j<i;j++)
63                 {
64                     if(getDis(i,j)<=d*d)  //两石子距离小于等于d
65                     {
66                         map[i][j]=1;
67                         map[j][i]=1;
68                     }
69                 }
70             }
71             if(!way)
72             {
73                 go(1);
74                 for(i=0;i<n;i++)
75                 {
76                     if(y0-y[i]<=d&&mark[i]!=0)      //存在可以跳到的石子(mark[i]!=0),且该石子可以跳到终点
77                     {
78                         way=1;
79                         if(sum>mark[i]+1)
80                             sum=mark[i]+1;
81                     }
82                 }
83             }
84             if(way)
85                 printf("YES\n%d\n",sum);
86             else
87                 printf("NO\n%d\n",der);
88         }
89     }
90     return 0;
91 }

PS:打得自己都晕了@#@,在此感谢林班头^_^o~ 努力!

转载于:https://www.cnblogs.com/weigx/p/4428938.html

B - 娜娜梦游仙境系列——跳远女王相关推荐

  1. F - 娜娜梦游仙境系列——多民族王国

    F - 娜娜梦游仙境系列--多民族王国 Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Othe ...

  2. G - 娜娜梦游仙境系列——梦醒

    G - 娜娜梦游仙境系列--梦醒 Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others) ...

  3. A - 娜娜梦游仙境系列——诡异的钢琴

    A - 娜娜梦游仙境系列--诡异的钢琴 Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Othe ...

  4. java精灵召唤_精灵召唤之梦游仙境

    快速搜索机型: 诺基亚 N70系列(176×208) 7610 3230 6600 6260 6620 6630 6670 6680 6681 6682 N70 N72 ;松下: X700 X800 ...

  5. java精灵召唤_精灵召唤之梦游仙境BT版

    快速搜索机型: 诺基亚 N73系列(240×320) N73 5320 5320XM 5320di_XM 5630XM 5700 5700XM 5710XM 5730XM 6110 6110N 612 ...

  6. 2021年SWPUACM暑假集训day4KMP算法

    什么是KMP算法 KMP算法(也叫看猫片算法(bushi)是Knuth.Pratt 和 Morris 在 1977 年共同发布一个在线性时间(O(n+m))字符串查找或匹配算法,常用于在一个文本串 S ...

  7. ACdream之kmp

    D - 娜娜梦游仙境系列--村民的怪癖 Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Othe ...

  8. 小学计算机一个游戏梦游,梦游先生小游戏合集(上部)

    梦游先生小游戏合集包含了目前网络上流行的梦游先生系列的1到4部. 梦游先生是热门的冒险解谜类游戏,梦游先生1到4部,支持离线玩. 梦游先生1-疯狂都市 经典的华纳冒险系列之梦游先生操作简单,但是情节, ...

  9. 各类牛B电影,暑假慢慢看完

    [感动无数人的9部电影] 1.<恋空> 2.<婚纱> 3.<比悲伤更悲伤的故事> 4.<我脑中的橡皮擦> 5.<属于你的我的初恋> 6.&l ...

最新文章

  1. 使用 XML 时尽量避免使用的技术
  2. [转载] 晓说——第31期:无比强大的美国工会
  3. RabbitMQ消息手动应答消费者
  4. t分布f分布与样本均值抽样分布_分布模拟1——MCMC抽样方法
  5. Android上实现柱状图表
  6. shell下数字和字符串比较操作命令
  7. 【bzoj 4675】 点对游戏
  8. android高德地图黑色,关于安卓高德地图的手机黑屏花屏模糊等症状处理
  9. [CLS]预训练语言模型的前世今生[SEP]萌芽时代[SEP]
  10. oc实时渲染的图如何导出_VR批量渲染如何同时保存通道图?「渲云渲染」
  11. 人工智能--遗传算法求解TSP问题
  12. 利用图神经网络进行社交机器人检测
  13. 华为性格测试注意事项
  14. IBus拼音无法选择候选词故障
  15. php身份证实名认证接口
  16. 为什么要去做亚马逊僵尸跟卖呢 亲身经历告诉你
  17. Python使用psutil的电脑资源监控软件
  18. 到底「美图秀秀」是艺术家,还是会 P 图的姑娘算艺术家?
  19. [题解]bzoj4826 HNOI2017 影魔
  20. JAVA项目学习之坦克大战单机版

热门文章

  1. 《LeetCode力扣练习》第21题 合并两个有序链表 Java
  2. oa 中会议推送 实现_诗尼曼:大OA+费控赋能千店一体,打造家居数字化标杆
  3. 匹兹堡计算机科学公司,2017美国匹兹堡大学计算机科学CS专业硕士录取
  4. cpld xilinx 定义全局时钟_AutoSAR中的时钟同步机制
  5. java数据模型公共类_UML数据建模工具之Enterprise Architect(EA)实例
  6. linux ubuntu基础,linux基础入门详细分析(基于ubuntu)
  7. PDF文件修改后,保存时出现:文档无法保存。读取文档时出现问题(135)
  8. win10创建新的计算机用户名和密码忘了,Win10 2004中要使用本计算机用户必须输入用户名和密码选项不见了如何恢复?...
  9. 为什么不可以使用哈曼顿距离_哈曼卡顿音乐琉璃1代2代评测,不但抓耳,还让你视线也难离开...
  10. python有关迭代器和生成器的面试题_【面试题 | Python中迭代器和生成器的区别?】- 环球网校...