zoukankan      html  css  js  c++  java
  • PAT 7-12 拯救007

    在老电影“007之生死关头”(Live and Let Die)中有一个情节,007被毒贩抓到一个鳄鱼池中心的小岛上,他用了一种极为大胆的方法逃脱 —— 直接踩着池子里一系列鳄鱼的大脑袋跳上岸去!(据说当年替身演员被最后一条鳄鱼咬住了脚,幸好穿的是特别加厚的靴子才逃过一劫。)

    设鳄鱼池是长宽为100米的方形,中心坐标为 (0, 0),且东北角坐标为 (50, 50)。池心岛是以 (0, 0) 为圆心、直径15米的圆。给定池中分布的鳄鱼的坐标、以及007一次能跳跃的最大距离,你需要告诉他是否有可能逃出生天。

    输入格式:

    首先第一行给出两个正整数:鳄鱼数量 N(≤)和007一次能跳跃的最大距离 D。随后 N 行,每行给出一条鳄鱼的 ( 坐标。注意:不会有两条鳄鱼待在同一个点上。

    输出格式:

    如果007有可能逃脱,就在一行中输出"Yes",否则输出"No"。

    输入样例 1:

    14 20
    25 -15
    -25 28
    8 49
    29 15
    -35 -2
    5 28
    27 -29
    -8 -28
    -20 -35
    -25 -20
    -13 29
    -30 15
    -35 40
    12 12
    

    输出样例 1:

    Yes
    

    输入样例 2:

    4 13
    -12 12
    12 12
    -12 -12
    12 -12
    

    输出样例 2:

    No

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    
    const int maxn = 110;
    int vis[110];
    int N, D;
    
    struct Node{
        int x;
        int y;
    }node[110];
    
    bool can(int a) {
        int xx = node[a].x;
        int yy = node[a].y;
    
        if((D + 7.5) * (D + 7.5) >= (xx * xx + yy * yy))
            return true;
        return false;
    }
    
    bool From_To(int a, int b) {
        int xa = node[a].x;
        int ya = node[a].y;
        int xb = node[b].x;
        int yb = node[b].y;
    
        if(D * D >= ((xa - xb) * (xa - xb) + (ya - yb) * (ya - yb)))
            return true;
        return false;
    }
    
    bool reach(int a) {
        int xx = node[a].x;
        int yy = node[a].y;
    
        if(xx < 0) xx *= (-1);
        if(yy < 0) yy *= (-1);
    
        if(D >= 50 - xx || D >= 50 - yy)
            return true;
        return false;
    }
    
    int dfs(int a) {
        int ans = 0;
        vis[a] = 1;
        if(reach(a)) ans = 1;
        else {
            for(int i = 0; i < N; i ++) {
                if(!vis[i] && From_To(a, i)) {
                         ans = dfs(i);
                    if(ans == 1) break;
                }
            }
        }
        return ans;
    }
    
    void solve() {
        bool flag;
        for(int i = 0; i < N; i ++) {
            if(!vis[i] && can(i))
                flag = dfs(i);
            if(flag == true) break;
        }
        if(flag) printf("Yes
    ");
        else printf("No
    ");
    }
    
    int main() {
        memset(vis, 0, sizeof(vis));
        scanf("%d%d", &N, &D);
        for(int i = 0; i < N; i ++)
            scanf("%d%d", &node[i].x, &node[i].y);
    
        solve();
        return 0;
    }
    

      

  • 相关阅读:
    source命令
    bash中单引号与双引号的总结
    鸟哥的linux私房菜学习笔记3
    鸟哥的linux私房菜学习笔记2
    /usr/sbin/atd 和 /etc/init.d/atd有什么区别
    Linux中/etc/fstab /etc/mtab /proc/mounts这三个文件的分析与比较
    服务器本机不能登陆的解决
    有用的博客
    推荐几个好用的PHP集成开发环境
    ANDROID开发笔记(二)
  • 原文地址:https://www.cnblogs.com/zlrrrr/p/10620410.html
Copyright © 2011-2022 走看看