您的位置:首页 > 其它

MOOC PTA 07-图5 Saving James Bond - Hard Version

2015-10-31 23:24 471 查看
http://pta.patest.cn/pta/test/18/exam/4/question/628

开头好几个点都不能AC,后来发现是鳄鱼可以在岸上和在岛上

还有存在一步跳到岸边的情况

我是用DFS走到最后看通不通 再回来更新

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
#define maxsize 10001
#define MIN -10001
int visit[maxsize]= {0};//一个顶点是否被访问
int flag=0;//判断一个顶点是否走的通
struct position//记录位置
{
int x;
int y;
} p[105];

int path[105];//记录路径
int d[105];//距离
int ist=0;//判断一条路中是否有通路
int ist1=0;//判断整个路径中是否存在通路
void DFS(int index,int n,int m)
{

if(abs(p[index].x)+m>=50||abs(p[index].y)+m>=50&&!flag)
{
path[index]=-1;
d[index]=1;
ist=1;
flag=1;
return;
}
if(!flag&&!visit[index])
{

visit[index]=1;

for(int i=1; i<=n; i++)
{
int b=(p[index].x-p[i].x)*(p[index].x-p[i].x)+(p[index].y-p[i].y)*(p[index].y-p[i].y);
if(!visit[i]&&b<=m*m)
DFS(i,n,m);

if(d[i]!=100001&&flag)
{
if(d[index]>d[i]+1)
{
d[index]=d[i]+1;
path[index]=i;
}
}

flag=0;
}
if(ist)
flag=1;
}
visit[index]=0;
}

int main()
{
int n,m;
int x,y;

for(int i=0; i<101; i++)
{
path[i]=-5;
d[i]=100001;
}

scanf("%d%d",&n,&m);
p[0].x=p[0].y=0;

for(int i=1; i<=n; i++)
{
scanf("%d%d",&x,&y);
if(abs(x)*abs(x)+abs(y)*abs(y)>=2500||abs(x)*abs(x)+abs(y)*abs(y)*4<=225)
{
n--;
i--;
continue;
}
p[i].x=x;
p[i].y=y;
}
if(m>=50)
printf("1\n");

else
{
for(int i=1; i<=n; i++)
{
int b=(p[i].x*p[i].x+p[i].y*p[i].y)*4;

if(!visit[i]&&(b<=(15+2*m)*(15+2*m)))

DFS(i,n,m);

if(d[i]!=100001&&ist)
{
ist1=1;

if(d[0]>d[i]+1)
{
d[0]=d[i]+1;
path[0]=i;
}
else if(d[0]==d[i]+1)
{
int a=(p[path[0]].x*p[path[0]].x+p[path[0]].y*p[path[0]].y)*4;

if(a>b)
path[0]=i;
}
flag=0;
ist=0;
}
}
if(!ist1)
printf("0\n");

else
{
int h=0;
int num=0;

printf("%d\n",d[0]);
h=path[0];

while(h!=-1)
{
printf("%d %d\n",p[h].x,p[h].y);
h=path[h];
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: