06-1. Saving James Bond - Hard Version (30) BFS

2024-08-30 21:18
文章标签 bfs 30 version 06 hard bond james saving

本文主要是介绍06-1. Saving James Bond - Hard Version (30) BFS,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

06-1. Saving James Bond - Hard Version (30)

时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue

This time let us consider the situation in the movie "Live and Let Die" in which James Bond, the world's most famous spy, was captured by a group of drug dealers. He was sent to a small piece of land at the center of a lake filled with crocodiles. There he performed the most daring action to escape -- he jumped onto the head of the nearest crocodile! Before the animal realized what was happening, James jumped again onto the next big head... Finally he reached the bank before the last crocodile could bite him (actually the stunt man was caught by the big mouth and barely escaped with his extra thick boot).

Assume that the lake is a 100 by 100 square one. Assume that the center of the lake is at (0,0) and the northeast corner at (50,50). The central island is a disk centered at (0,0) with the diameter of 15. A number of crocodiles are in the lake at various positions. Given the coordinates of each crocodile and the distance that James could jump, you must tell him a shortest path to reach one of the banks. The length of a path is the number of jumps that James has to make.

Input Specification:

Each input file contains one test case. Each case starts with a line containing two positive integers N (<=100), the number of crocodiles, and D, the maximum distance that James could jump. Then N lines follow, each containing the (x, y) location of a crocodile. Note that no two crocodiles are staying at the same position.

Output Specification:

For each test case, if James can escape, output in one line the minimum number of jumps he must make. Then starting from the next line, output the position (x, y) of each crocodile on the path, each pair in one line, from the island to the bank. If it is impossible for James to escape that way, simply give him 0 as the number of jumps. If there are many shortest paths, just output the one with the minimum first jump, which is guaranteed to be unique.

Sample Input 1:
17 15
10 -21
10 21
-40 10
30 -50
20 40
35 10
0 -10
-25 22
40 -40
-30 30
-10 22
0 11
25 21
25 10
10 10
10 35
-30 10
Sample Output 1:
4
0 11
10 21
10 35
Sample Input 2:
4 13
-12 12
12 12
-12 -12
12 -12
Sample Output 2:
0

提交代码

因为期末了  没时间做  今天抽了时间研究了下 ,这道题你用bfs搜索最短路,但是难在路径输出和如果有多条相同的最短路径,那么要输出第一跳最小的那个 具体将代码注释

最后再说一句  这个孤岛的直径是15.。。 简单版的我直接当成半径用了 居然也能过。。。

#include <iostream>
#include <algorithm>
#include <string>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
using namespace std;
#define lson rt<<1,l,MID
#define rson rt<<1|1,MID+1,r
//#define lson root<<1
//#define rson root<<1|1
#define MID ((l+r)>>1)
typedef long long ll;
typedef pair<int,int> P;
const int maxn=1005;
const int base=1000;
const int inf=999999;
const double eps=1e-5;
struct node//保存每个鳄鱼的位置  对应图的节点
{double x,y;int num;double dis;bool friend operator<(node a,node b)//定义优先级  后面优先队列 在多多条相同的最短路径里找第一步最小的{return a.dis<b.dis;}
} p[maxn];
double d;
int n;
double dis(double x,double y,double xx,double yy)//判断两点间的距离,用于判断是不是能跳上 即判断是不是邻接的
{return d-sqrt((x-xx)*(x-xx)+(y-yy)*(y-yy));
}bool pan(node s)//判断当前点是否能够跳到岸上
{if(fabs(s.x-50)<=d||fabs(s.x+50)<=d||fabs(s.y-50)<=d||(s.y+50)<=d)return true;return false;
}double find_small_first(node s)//找开始在孤岛中心能跳到的点
{return sqrt(s.x*s.x+s.y*s.y)-7.5;
}int di[maxn];
int pr[maxn];
int bfs(node s)
{//bfs搜索  不多说memset(di,-1,sizeof(di));memset(pr,-1,sizeof(pr));queue<node> q;q.push(s);di[s.num]=0;int i;while(!q.empty()){node tmp=q.front();q.pop();if(pan(tmp)){return tmp.num;}for( i=1;i<=n;i++){if(dis(p[i].x,p[i].y,tmp.x,tmp.y)>=0&&di[p[i].num]==-1){q.push(p[i]);di[p[i].num]=di[tmp.num]+1;pr[p[i].num]=tmp.num;}}}return 0;
}vector<int> get_path(int t)//路径还原函数
{vector<int> path;for(;t!=-1;t=pr[t])path.push_back(t);reverse(path.begin(),path.end());return path;
}int main()
{int m,i,j,k,t;cin>>n>>d;for(i=1; i<=n; i++){cin>>p[i].x>>p[i].y;p[i].num=i;}if(d+7.5>=50)//特判  对应测试的最后一个测试点{printf("1\n");return 0;}priority_queue<node> q;//优先队列 在相同的最短路 里 找第一步最小的vector<int> path;for(i=1;i<=n;i++){double kk=find_small_first(p[i]);if(kk>=0&&kk<=d){p[i].dis=kk;q.push(p[i]);}}int dist;int flag=1;while(!q.empty())//尝试 从孤岛中心 所能到达的所有点{nodetmp=q.top();q.pop();t=bfs(tmp);//cout<<di[t]<<' '<<t<<endl;if(flag&&t!=0){dist=di[t];path=get_path(t);flag=0;}else if(t!=0&&di[t]<=dist){path=get_path(t);dist=di[t];}}t=path.size();if(t==0)printf("0\n");else{printf("%d\n",t+1);for(i=0;i<t;i++)printf("%.0lf %.0lf\n",p[path[i]].x,p[path[i]].y);}return 0;
}
/*
17 15
10 -21
10 21
-40 10
30 -50
20 40
35 10
0 -10
-25 22
40 -40
-30 30
-10 22
0 11
25 21
25 10
10 10
10 35
-30 104 13
-12 12
12 12
-12 -12
12 -12*/

这篇关于06-1. Saving James Bond - Hard Version (30) BFS的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1121954

相关文章

mysql-8.0.30压缩包版安装和配置MySQL环境过程

《mysql-8.0.30压缩包版安装和配置MySQL环境过程》该文章介绍了如何在Windows系统中下载、安装和配置MySQL数据库,包括下载地址、解压文件、创建和配置my.ini文件、设置环境变量... 目录压缩包安装配置下载配置环境变量下载和初始化总结压缩包安装配置下载下载地址:https://d

提示:Decompiled.class file,bytecode version如何解决

《提示:Decompiled.classfile,bytecodeversion如何解决》在处理Decompiled.classfile和bytecodeversion问题时,通过修改Maven配... 目录问题原因总结问题1、提示:Decompiled .class file,China编程 bytecode

hdu1254(嵌套bfs,两次bfs)

/*第一次做这种题感觉很有压力,思路还是有点混乱,总是wa,改了好多次才ac的思路:把箱子的移动当做第一层bfs,队列节点要用到当前箱子坐标(x,y),走的次数step,当前人的weizhi(man_x,man_y),要判断人能否将箱子推到某点时要嵌套第二层bfs(人的移动);代码如下:

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

30常用 Maven 命令

Maven 是一个强大的项目管理和构建工具,它广泛用于 Java 项目的依赖管理、构建流程和插件集成。Maven 的命令行工具提供了大量的命令来帮助开发人员管理项目的生命周期、依赖和插件。以下是 常用 Maven 命令的使用场景及其详细解释。 1. mvn clean 使用场景:清理项目的生成目录,通常用于删除项目中自动生成的文件(如 target/ 目录)。共性规律:清理操作

2024网安周今日开幕,亚信安全亮相30城

2024年国家网络安全宣传周今天在广州拉开帷幕。今年网安周继续以“网络安全为人民,网络安全靠人民”为主题。2024年国家网络安全宣传周涵盖了1场开幕式、1场高峰论坛、5个重要活动、15场分论坛/座谈会/闭门会、6个主题日活动和网络安全“六进”活动。亚信安全出席2024年国家网络安全宣传周开幕式和主论坛,并将通过线下宣讲、创意科普、成果展示等多种形式,让广大民众看得懂、记得住安全知识,同时还

poj 2195 bfs+有流量限制的最小费用流

题意: 给一张n * m(100 * 100)的图,图中” . " 代表空地, “ M ” 代表人, “ H ” 代表家。 现在,要你安排每个人从他所在的地方移动到家里,每移动一格的消耗是1,求最小的消耗。 人可以移动到家的那一格但是不进去。 解析: 先用bfs搞出每个M与每个H的距离。 然后就是网络流的建图过程了,先抽象出源点s和汇点t。 令源点与每个人相连,容量为1,费用为

POJ 3057 最大二分匹配+bfs + 二分

SampleInput35 5XXDXXX...XD...XX...DXXXXX5 12XXXXXXXXXXXXX..........DX.XXXXXXXXXXX..........XXXXXXXXXXXXX5 5XDXXXX.X.DXX.XXD.X.XXXXDXSampleOutput321impossible

Maven创建项目中的groupId, artifactId, 和 version的意思

文章目录 groupIdartifactIdversionname groupId 定义:groupId 是 Maven 项目坐标的第一个部分,它通常表示项目的组织或公司的域名反转写法。例如,如果你为公司 example.com 开发软件,groupId 可能是 com.example。作用:groupId 被用来组织和分组相关的 Maven artifacts,这样可以避免

深度优先(DFS)和广度优先(BFS)——算法

深度优先 深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支,当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访