pat06-图4. Saving James Bond - Hard Version (30)
06-图4. Saving James Bond - Hard Version (30)
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
本题测试点5是从小岛范围内可以直接跳到岸边。
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<queue>
#include<stack>
#include<cmath>
#include<string>
using namespace std;
#define R 7.5
struct point
{
int x,y,last;
bool vis;
point()
{
vis=false;
}
point(int num)
{
vis=false;
last=num;
}
};
point p[];
queue<int> q;
double getdis(int x1,int y1,int x2,int y2)
{
int x=x1-x2;
int y=y1-y2;
return sqrt(x*x+y*y);
}
int abs(int a)
{
return a>?a:-a;
}
int main()
{
//freopen("D:\\INPUT.txt","r",stdin);
int n,J;
scanf("%d %d",&n,&J);
int i,level=,last=-,tail;
for(i=; i<n; i++)
{
scanf("%d %d",&p[i].x,&p[i].y);
p[i].last=i;
}
if(R+J>=){//小岛内直接跳到岸边
printf("1\n");
return ;
}
for(i=; i<n; i++)
{
if(getdis(,,p[i].x,p[i].y)<=R){//无效点
p[i].vis=true;
continue;
}
if(R+J>=getdis(,,p[i].x,p[i].y))
{
q.push(i);
p[i].vis=true;
last=i;
if(abs(p[i].x)+J>=||abs(p[i].y)+J>=)
{
printf("2\n");
printf("%d %d\n",p[i].x,p[i].y);
return ;
}
}
}
if(last==-){//一开始就没有可以跳的点
printf("0\n");
return ;
}
int cur,firstj=J+,fitp,count=;
while(!q.empty())
{
cur=q.front();
q.pop();
for(i=; i<n; i++)
{
if(!p[i].vis&&J>=getdis(p[cur].x,p[cur].y,p[i].x,p[i].y))
{//没有入队并且符合要求
p[i].vis=true;
q.push(i);//入队
p[i].last=cur;
tail=i;
if(abs(p[i].x)+J>=||abs(p[i].y)+J>=)
{
int now=i;
while(p[now].last!=now){
now=p[now].last;
}
if(getdis(,,p[now].x,p[now].y)-R<firstj){
firstj=getdis(,,p[now].x,p[now].y)-R;
fitp=i;
count=level+;
}
}
}
}
if(cur==last){
level++;//向下一层进发
last=tail;
}
if(level==count){
break;
}
}
stack<int> s;
if(count)
{
count++;
while(p[fitp].last!=fitp)
{
s.push(fitp);
fitp=p[fitp].last;
}
s.push(fitp);
}
printf("%d\n",count);
while(!s.empty())
{
printf("%d %d\n",p[s.top()].x,p[s.top()].y);
s.pop();
}
return ;
}
pat06-图4. Saving James Bond - Hard Version (30)的更多相关文章
- PTA 07-图5 Saving James Bond - Hard Version (30分)
07-图5 Saving James Bond - Hard Version (30分) This time let us consider the situation in the movie ...
- 07-图5 Saving James Bond - Hard Version (30 分)
This time let us consider the situation in the movie "Live and Let Die" in which James Bon ...
- Saving James Bond - Easy Version (MOOC)
06-图2 Saving James Bond - Easy Version (25 分) This time let us consider the situation in the movie & ...
- pat05-图2. Saving James Bond - Easy Version (25)
05-图2. Saving James Bond - Easy Version (25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作 ...
- Saving James Bond - Hard Version
07-图5 Saving James Bond - Hard Version(30 分) This time let us consider the situation in the movie &q ...
- Saving James Bond - Easy Version 原创 2017年11月23日 13:07:33
06-图2 Saving James Bond - Easy Version(25 分) This time let us consider the situation in the movie &q ...
- PAT Saving James Bond - Easy Version
Saving James Bond - Easy Version This time let us consider the situation in the movie "Live and ...
- 06-图2 Saving James Bond - Easy Version
题目来源:http://pta.patest.cn/pta/test/18/exam/4/question/625 This time let us consider the situation in ...
- PTA 06-图2 Saving James Bond - Easy Version (25分)
This time let us consider the situation in the movie "Live and Let Die" in which James Bon ...
随机推荐
- 读paper笔记[Learning to rank]
读paper笔记[Learning to rank] by Jiawang 选读paper: [1] Ranking by calibrated AdaBoost, R. Busa-Fekete, B ...
- Notification通知代码简洁使用
1.自定义发送 Notification 的使用 1.1 通知(消息)的创建 ---------------详细介绍篇 // 不带消息内容 NSNotification *notification1 ...
- Copy拷贝
前言 copy:需要先实现 NSCopying 协议,创建的是不可变副本. mutableCopy:需要实现 NSMutableCopying 协议,创建的是可变副本. 浅拷贝:指针拷贝,源对象和副本 ...
- webpack4 入门(二)
一.管理输出 1.多入口配置 entry: { index1: './src/index.js', index2: './src/index2.js' }, output: { filename: ' ...
- Vue.js 的几点总结Watchers/router key/render
Vue.js 的几点总结,下面就是实战案例,一起来看一下. 第一招:化繁为简的Watchers 场景还原: 1 2 3 4 5 6 7 8 created(){ this.fetchPostLis ...
- flink学习笔记-各种Time
说明:本文为<Flink大数据项目实战>学习笔记,想通过视频系统学习Flink这个最火爆的大数据计算框架的同学,推荐学习课程: Flink大数据项目实战:http://t.cn/EJtKh ...
- 模板:二维树状数组 【洛谷P4054】 [JSOI2009]计数问题
P4054 [JSOI2009]计数问题 题目描述 一个n*m的方格,初始时每个格子有一个整数权值.接下来每次有2种操作: 改变一个格子的权值: 求一个子矩阵中某种特定权值出现的个数. 输入输出格式 ...
- 使用box-shadow 实现水波、音波的效果
用到的工具 animation box-shadow html: <div class="watersource"> </div> css: .waters ...
- TP框架中D方法和M方法
D()和M()方法的区别: D和M的区别主要在于 M方法不需要创建模型类文件,M方法不会读取模型类,所以默认情况下自动验证是无效的,但是可以通过动态赋值的方式实现 而D方法必须有创建模型类. 我们可以 ...
- c#操作windows本地账户
using System;using System.Collections.Generic;using System.Text;using System.Runtime.InteropServices ...