zoukankan      html  css  js  c++  java
  • 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/

  • 相关阅读:
    面向切面编程AOP
    多线程:Monitor、synchronized、volatile
    约束布局ConstraintLayout
    【转】StackTraceElement获取方法调用栈的信息
    Java中的Type
    Android App 架构演变
    Java泛型
    web测试方法总结
    机器学习 损失函数
    深度学习 激活函数
  • 原文地址:https://www.cnblogs.com/xryz/p/4848004.html
Copyright © 2011-2022 走看看