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

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值