• 07-图4. Saving James Bond


    本题测试点5是从小岛范围内可以直接跳到岸边……
    测试点4是验证步数第一跳最小的情况,刚开始没有考虑回溯,所以错了……

    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <queue>
    #include <set>
    #include <map>
    #include <string>
    #include <math.h>
    #include <stdlib.h>
    #include <time.h>
    using namespace std;
    const int inf=1<<30;
    struct node
    {
        double x,y;
    } a[100+5];
    int n,vis[100+5],b[100+5],ans[100+5],cnt;
    double d,ansfirst,nowfirst;
    int dis(node d1,node d2)
    {
        if(d*d<(d1.x-d2.x)*(d1.x-d2.x)+(d1.y-d2.y)*(d1.y-d2.y)) return 0;
        return 1;
    }
    int first(int d1)
    {
        if(sqrt(a[d1].x*a[d1].x+a[d1].y*a[d1].y)>d+7.5) return 0;
        else return 1;
    }
    
    double first1(int d1)
    {
        return sqrt(a[d1].x*a[d1].x+a[d1].y*a[d1].y)-7.5;
    }
    int safe(node d1)
    {
        if(d1.x>=50-d) return 1;
        if(d1.y>=50-d) return 1;
        if(d1.x<=-50+d) return 1;
        if(d1.y<=-50+d) return 1;
        return 0;
    }
    void dfs(int d1,int now)
    {
        int i;
        if(safe(a[d1]))
        {
            //printf("%d %.2f
    ",now,nowfirst);
            if(now<cnt)
            {
                for(i=0; i<now; i++)
                    ans[i]=b[i];
                cnt=now;
                ansfirst=nowfirst;
            }
            else if(now==cnt&&ansfirst>nowfirst)
            {
                for(i=0; i<now; i++)
                    ans[i]=b[i];
                cnt=now;
                ansfirst=nowfirst;
            }
            return ;
        }
        else
        {
            for(i=1; i<=n; i++)
            {
                if(!vis[i]&&dis(a[d1],a[i]))
                {
                    vis[i]=1;
                    b[now]=i;
                    dfs(i,now+1);
                    vis[i]=0;
                }
            }
        }
        return;
    }
    int main()
    {
        int i;
        while(~scanf("%d%lf",&n,&d))
        {
            a[0].x=a[0].y=0;
            for(i=1; i<=n; i++)
            {
                scanf("%lf%lf",&a[i].x,&a[i].y);
            }
            if(d+7.5>=50)
            {
                printf("1
    ");
                return 0;
    
            }
            ansfirst=(double)inf;
            cnt=inf;
            memset(ans,0,sizeof(ans));
            for(i=1; i<=n; i++)
            {
                memset(vis,0,sizeof(vis));
                if(!vis[i]&&first(i))
                {
                    nowfirst=first1(i);
                    if(safe(a[i]))
                    {
                        if(ansfirst>nowfirst)
                        {
                            ans[0]=i;
                            cnt=1;
                            ansfirst=nowfirst;
                        }
                    }
                    vis[i]=1;
                    memset(b,0,sizeof(b));
                    b[0]=i;
                    dfs(i,1);
                }
            }
            if(cnt==inf) printf("0
    ");
            else
            {
                printf("%d
    ",cnt+1);
                for(i=0; i<cnt; i++)
                {
                    printf("%.0f %.0f
    ",a[ans[i]].x,a[ans[i]].y);
                }
            }
        }
        return 0;
    }

    版权声明:本文为博主原创文章,未经博主允许不得转载。http://xiang578.top/

  • 相关阅读:
    call和apply的区别
    淘宝镜像(cnpm)的安装和使用
    文件包含漏洞
    vue简单的日历
    微信小程序(mpvue)—解决视频播放bug的一种方式
    vue 异步组件
    vuex的学习笔记
    vue2.0 添加监听滚动事件
    jquery tmpl生成导航
    vue 控制视图
  • 原文地址:https://www.cnblogs.com/xryz/p/4848004.html
Copyright © 2020-2023  润新知