7-5 拯救007(升级版) (30 分)
My 修改AC code:
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
double x[200],y[220];
const int inf =0x3f3f3f3f;
struct node{
double x,y;
int i;
int s;
}a[500];
int n;
double D;
int b[500];
double dis(double x,double y,double x1,double y1){
return sqrt((x-x1)*(x-x1)+(y-y1)*(y-y1));
}
int pre[500];
node u;
int pan(double x,double y){
if(fabs(x+D)>=50||fabs(y+D)>=50||fabs(x-D)>=50||fabs(y-D)>=50)return 1;
return 0;
}
int vis[520];
int cmp1(int x)
{
if((a[x].x*a[x].x+a[x].y*a[x].y)<=(D+7.5)*(D+7.5))return (int)(a[x].x*a[x].x+a[x].y*a[x].y);
return 0;
}
bool cmp(int a,int b)
{
return cmp1(a)<cmp1(b);
}
void bfs(){
queue<node>o;
memset(vis,0,sizeof vis);
memset(pre,-1,sizeof pre);
node oo;
// oo.x =0;
// oo.y = 0;
// oo.s =0;
// oo.i = 0;
// vis[0] = 1;
// o.push(oo);
for(int i=1; i<=n; i++)
{
b[i] = i;
}
sort(b+1,b+1+n,cmp);
for(int i=1; i<=n; i++)
{
int h = b[i];
if(cmp1(h))
{
node oo;
oo.x =a[h].x;
oo.y = a[h].y;
oo.s =2;
oo.i = h;
//vis[0] = 1;
o.push(oo);
vis[h] = 1;
pre[h] = 0;
}
}
u.i = -1;
while(!o.empty()){
node p = o.front();
o.pop();
// cout<<p.i<<" "<<p.s<<endl;
if(pan(p.x,p.y)){
u = p;
break;
}
for(int i=1;i<=n;i++){
if(vis[a[i].i])continue;
if(dis(p.x,p.y,a[i].x,a[i].y)<=D){
node tt;
tt.x = a[i].x;
tt.y = a[i].y;
tt.i = a[i].i;
tt.s = p.s+1;
o.push(tt);
vis[a[i].i] =1;
pre[a[i].i] =p.i;
}
}
}
}
int main()
{
cin>>n>>D;
for(int i=1;i<=n;i++){
cin>>a[i].x>>a[i].y;
a[i].i = i;
}
//printf("0\n");
bfs();
if(D>=42.5){
cout<<1<<endl;
return 0;
}
if(u.i==-1){
printf("0\n");
}
else{
cout<<u.s<<endl;
int ppre = u.i;
stack<int>ans;
while(ppre!=-1){
if(ppre==0)break;
// cout<<a[ppre].x<<" "<<a[ppre].y<<endl;
ans.push(ppre);
ppre = pre[ppre];
}
while(!ans.empty()){
ppre = ans.top();
ans.pop();
cout<<a[ppre].x<<" "<<a[ppre].y<<endl;
}
}
return 0;
}
Right code:
#include "iostream"
#include "math.h"
#include "queue"
#include "stack"
#include "algorithm"
using namespace std;
int n, m;
#define MINLEN 42.5
struct Pointer {
int x;
int y;
}point[101];
bool answer = false; /* 记录007能否安全逃生~~ */
bool visited[101] = { false }; /* 判断当前点是否被访问过 */
int path[101] = {-1}; /* 记录跳跃过程中踩过的鳄鱼 */
bool isSave(int x) { /* 判断从当前点能否跳到岸上 */
if ((point[x].x - m <= -50) || (point[x].x + m >= 50) || (point[x].y - m <= -50) || (point[x].y + m >= 50))
return true;
return false;
}
bool jump(int x, int y) { /* 判断2个点距离是否在跳跃能力内 */
int p1 = pow(point[x].x - point[y].x, 2);
int p2 = pow(point[x].y - point[y].y, 2);
int r = m * m;
if (p1 + p2 <= r)
return true;
return false;
}
int firstJump(int x) { /* 当007处于孤岛时 第一次可以选择跳的鳄鱼 因为第一次判断能否跳跃的计算方法与后面dfs不相同 所以要单独写 */
int p1 = pow(point[x].x, 2);
int p2 = pow(point[x].y, 2);
int r = (m + 7.5) * (m + 7.5);
if (p1 + p2 <= r) {
return p1+p2;
}
return 0;
}
bool cmp(int a,int b) {
return firstJump(a) < firstJump(b);
}
void bfs() { /* 用bfs来判断最少要踩几个小鳄鱼才能上岸 */
int b[101];
queue<int>q;
/* 将第一步能踩到的鳄鱼按距离从小到大的顺序进队列~ 因为输出结果要保证在踩的鳄鱼数量相等的情况下 输出第一步距离最短的~~*/
for (int i = 0; i < n; i++) {
b[i] = i;
}
sort(b, b + n, cmp); /* 按照第一步的距离排序~~~ */
int last;
for (int i = 0; i < n; i++) {
if (firstJump(b[i])) { /* 能跳上去! */
q.push(b[i]);
visited[b[i]] = true; /* 指向当前层数最后一个数~ */
last = b[i];
}
}
int step = 2; /* 记录最少要跳跃的次数 */
int tail;
while (!q.empty()) {
int p = q.front();
q.pop();
if (isSave(p)) {
int k = 1;
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 = 0; i < n; i++) {
if (!visited[i] && jump(p, i)) { /* 没踩过并且能跳到 */
q.push(i);
path[i] = p; /* 记得当前进队节点的父节点~ */
visited[i] = true;
tail = i; /* 指向下一层的最后一个元素 */
}
}
if (last == p) { /* 即将进入下一层~ */
step += 1;
last = tail;
}
}
if (q.empty()) { /* 如果队列为空 说明没跳出去啊~ */
cout << "0" << endl;
}
}
int main() {
cin >> n >> m;
for (int i = 0; i < n; i++) {
cin >> point[i].x >> point[i].y;
}
if (m >= MINLEN) { /* 可以直接从孤岛上提到岸上 直接输出 */
cout << "1" << endl;
return 0;
}
bfs();
return 0;
}my code:
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
double x[200],y[220];
const int inf =0x3f3f3f3f;
struct node
{
double x,y;
int i;
int s;
} a[500];
int n,D;
double dis(double x,double y,double x1,double y1)
{
return sqrt((x-x1)*(x-x1)+(y-y1)*(y-y1));
}
int pre[500];
node u;
int pan(double x,double y)
{
if(fabs(x+D)>=50||fabs(y+D)>=50)return 1;
return 0;
}
int vis[320];
vector<node>aa;
int ttop =1,tttop=-1;
void bfs()
{
queue<node>o;
memset(vis,0,sizeof vis);
memset(pre,-1,sizeof pre);
node oo;
oo.x =0;
oo.y = 0;
oo.s =0;
oo.i = 0;
vis[0] = 1;
o.push(oo);
u.i = -1;
while(!o.empty())
{
node p = o.front();
o.pop();
// cout<<p.i<<" "<<p.s<<endl;
if(pan(p.x,p.y))
{
u = p;
if(ttop)
{
tttop = u.s;
ttop =0;
}
aa.push_back(u);
}
for(int i=1; i<=n; i++)
{
if(vis[a[i].i])continue;
if(dis(p.x,p.y,a[i].x,a[i].y)<=D)
{
node tt;
tt.x = a[i].x;
tt.y = a[i].y;
tt.i = a[i].i;
tt.s = p.s+1;
o.push(tt);
vis[a[i].i] =1;
pre[a[i].i] =p.i;
}
}
}
}
int main()
{
cin>>n>>D;
for(int i=1; i<=n; i++)
{
cin>>a[i].x>>a[i].y;
a[i].i = i;
}
//printf("0\n");
bfs();
if(u.i==-1)
{
printf("0\n");
}
else
{
//cout<<aa.size()<<endl;
double AA =inf;
for(node kk:aa)
{
if(kk.s==tttop)
{
int pp = kk.i;
while(pp!=-1)
{
if(pp==0)break;
// cout<<a[ppre].x<<" "<<a[ppre].y<<endl;
//ans.push(ppre);
if(pre[pp]==0){
if(dis(0,0,a[pp].x,a[pp].y)<AA){
AA = dis(0,0,a[pp].x,a[pp].y);
u = kk;
}
}
pp = pre[pp];
}
}
}
cout<<u.s+1<<endl;
int ppre = u.i;
stack<int>ans;
while(ppre!=-1)
{
if(ppre==0)break;
// cout<<a[ppre].x<<" "<<a[ppre].y<<endl;
ans.push(ppre);
ppre = pre[ppre];
}
while(!ans.empty())
{
ppre = ans.top();
ans.pop();
cout<<a[ppre].x<<" "<<a[ppre].y<<endl;
}
}
return 0;
}