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 (≤), the number of crocodiles, and D, the maximum distance that James could jump. Then N lines follow, each containing the ( 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 ( 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
#include<cstdio>
#include<iostream>
#include<stack>
#include<queue>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn = ;
const int minLen = - /;
struct Pointer{
int x,y;
}point[maxn];
int path[maxn] = {-};
bool visited[maxn] = {false};
int d[maxn],n,m; void init(){
for(int i = ; i < n; i++) d[i] = i;
} bool Jump(int u,int v){
int d1 = pow(point[u].x - point[v].x,);
int d2 = pow(point[u].y - point[v].y,);
int r = m * m;
if(r >= d1 + d2) return true;
else return false;
} int firstJump(int v){
int d1 = pow(point[v].x,);
int d2 = pow(point[v].y,);
int r = (m+7.5)*(m+7.5);
if(r >= d1 + d2) return d1+d2;
else return ;
} bool isSafe(int x) { /* 判断从当前点能否跳到岸上 */
if ((point[x].x - m <= -) || (point[x].x + m >= ) || (point[x].y - m <= -) || (point[x].y + m >= ))
return true;
return false;
} bool cmp(int x,int y){
return firstJump(d[x]) < firstJump(d[y]);
} void BFS() { /* 用bfs来判断最少要踩几个小鳄鱼才能上岸 */
int b[];
queue<int>q;
/* 将第一步能踩到的鳄鱼按距离从小到大的顺序进队列~ 因为输出结果要保证在踩的鳄鱼数量相等的情况下 输出第一步距离最短的~~*/
for (int i = ; i < n; i++) {
b[i] = i;
}
sort(b, b + n, cmp); /* 按照第一步的距离排序~~~ */
int last;
for (int i = ; i < n; i++) {
if (firstJump(b[i])) { /* 能跳上去! */
q.push(b[i]);
visited[b[i]] = true; /* 指向当前层数最后一个数~ */
last = b[i];
}
}
int step = ; /* 记录最少要跳跃的次数 */
int tail;
while (!q.empty()) {
int p = q.front();
q.pop();
if (isSafe(p)) {
int k = ;
stack<int> s;
cout << step << endl;
while (k < step) {
//cout << point[p].x << " " << point[p].y << endl;
s.push(p);
p = path[p];
k++;
}
while (!s.empty()) {
p = s.top();
s.pop();
cout << point[p].x << " " << point[p].y << endl;
}
return;
}
for (int i = ; i < n; i++) {
if (!visited[i] && Jump(p, i)) { /* 没踩过并且能跳到 */
q.push(i);
path[i] = p; /* 记得当前进队节点的父节点~ */
visited[i] = true;
tail = i; /* 指向下一层的最后一个元素 */
}
}
if (last == p) { /* 即将进入下一层~ */
step += ;
last = tail;
}
}
if (q.empty()) { /* 如果队列为空 说明没跳出去啊~ */
cout << "" << endl;
}
} int main(){
scanf("%d%d",&n,&m);
init();
for(int i = ; i < n; i++){
scanf("%d%d",&point[i].x,&point[i].y);
}
if(m >= minLen){
printf("1\n");
return ;
}
BFS();
return ;
}

07-图5 Saving James Bond - Hard Version (30 分)的更多相关文章

  1. 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 ...

  2. 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 ...

  3. pat06-图4. Saving James Bond - Hard Version (30)

    06-图4. Saving James Bond - Hard Version (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作 ...

  4. 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 ...

  5. 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 ...

  6. 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 ...

  7. Saving James Bond - Easy Version (MOOC)

    06-图2 Saving James Bond - Easy Version (25 分) This time let us consider the situation in the movie & ...

  8. pat05-图2. Saving James Bond - Easy Version (25)

    05-图2. Saving James Bond - Easy Version (25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作 ...

  9. Saving James Bond - Hard Version

    07-图5 Saving James Bond - Hard Version(30 分) This time let us consider the situation in the movie &q ...

  10. PAT Saving James Bond - Easy Version

    Saving James Bond - Easy Version This time let us consider the situation in the movie "Live and ...

随机推荐

  1. Android中同一个ImageView中根据状态显示不同图片

    一般: if(条件1) { image.setBackground(R.id.xxx1); } else if (条件2) { image.setBackground(R.id.xxx2); } 实际 ...

  2. linq 初步认识

    linq to sql 类 介绍: linq如果不能用的话 重装一下vs就好了 LINQ,语言集成查询(Language Integrated Query)是一组用于c#和Visual Basic语言 ...

  3. PCL—点云分割(基于凹凸性) 低层次点云处理

    博客转载自:http://www.cnblogs.com/ironstark/p/5027269.html 1.图像分割的两条思路 场景分割时机器视觉中的重要任务,尤其对家庭机器人而言,优秀的场景分割 ...

  4. 95E Lucky Country

    传送门 题目大意 如果一个数中不包含除4和7之外的数字则是幸运数.有n个岛屿,通过双向道路连接.这些岛屿被分为几个地区.每个岛属于恰好一个区域,同一区域中的任何两个岛之间存在道路,不同区域的任何两个岛 ...

  5. 第四章输入/输出(I/O)4.1I/O涉及的设备及相关概念简介

    PCL中所有的处理都是基于点云展开的,利用不同的设备获取点云.存储点云等都是点云处理前后必须做的流程,PCL中有自己设计的内部PCD文件格式,为此,设计读写该该格式以及与其他3D文件格式之间进行转化的 ...

  6. Android之九宫格解锁的实现

        <ignore_js_op>                                                  下面是最重要的那个LocusPassWordView ...

  7. java求几个数字的和输出详细步骤

    设计思想:要求几个数字的和,就要把输入的字符串转换成浮点型,然后求和再输出. 程序流程图: 程序源代码: //此程序用于从命令行接收多个数字,就和并输出. //作者:赵东睿 //2015.9.26 p ...

  8. MVC中使用代码创建数据库(code first +mysql+EF)

    1.新建一个mvc项目 2.安装mysql需要的几个文件 EntityFramework.MySql.Data(6.9.12)和MySql.Data.Entity (6.9.12) 这里有几点要注意 ...

  9. 根据某条件给GridView符合条件的值画上删除线

    如博文标题,根据某些条件对GridView控件中,对符合条件的值画上删除线效果.实现这些要求,只人捕获到哪些符合要求的数据即可.GridView控件是在TemplateField模版显示数据,Insu ...

  10. boostrap 进入条显示百分比

    <div class="progress"> <div class="progress-bar progress-bar-success"  ...