06-图2 Saving James Bond - Easy Version

Saving James Bond - Easy Version

如陈越老师所说,是在前一道题listComponents的基础上作改进

#include <iostream>
#include <utility> // pair
#include <cmath>
#define MAXNUM 100
using namespace std;

pair<int, int> gragh[MAXNUM];
bool visited[MAXNUM] = {false};
// 孤岛半径7.5 试探从孤岛开始的第一跳
bool firstJump( int D, int id ) { // id:第一步试图要跳的鳄鱼下标
    pair<int, int> land(0,0);
    double dst = sqrt(pow(gragh[id].first, 2) + pow(gragh[id].second, 2));
    if( D + 7.5 < dst ) return false; // 够不着, 不能跳
    else    return true;
}
// 当前能跳到岸上则安全
bool isSave( int D, int id ) { // 当前鳄鱼下标
    if( D >= 50 - gragh[id].second )    return true;     // 上
    else if( D >= gragh[id].second + 50 )   return true; // 下
    else if( D >= gragh[id].first + 50 )    return true; // 左
    else if( D >= 50 - gragh[id].first )    return true; // 右
    else    return false; // 哪条边界都够不着
}
// 两鳄鱼能否跳
bool jump( int D, int a, int b ) { // 起点 目标
    double dst = sqrt( pow(gragh[a].first-gragh[b].first, 2) + pow(gragh[a].second-gragh[b].second, 2) );
    if( D < dst )   return false; // 够不着, 不能跳
    else    return true;
}
// 深度优先遍历
bool DFS( int N, int D, int id ) { // id:当前鳄鱼的下标
    bool answer;
    visited[id] = true;
    if( isSave(D, id) )  answer = true; // 任意时刻能跳到岸上
    else
        for( int i = 0; i < N; i++ ) // 对当前鳄鱼的所有下一条鳄鱼, 深度优先
            if( !visited[i] && jump(D, id, i) ) {
                answer = DFS(N, D, i);
                if( answer )    break;
            }
    return answer;
}

void save007( int N, int D ) {
    bool answer;
    for( int i = 0; i < N; i++ ) { // 从孤岛开始, 对每个连通集
        if( !visited[i] && firstJump(D, i) ) {
            answer = DFS(N, D, i);
            if( answer )    break;
        }
    }
    if(answer)  cout << "Yes";
    else    cout << "No";
}

int main() {
    int N, D; // 鳄鱼个数, 跳的最大距离
    cin >> N >> D;
    for( int i = 0; i < N; i++ )
        cin >> gragh[i].first >> gragh[i].second; // 横纵坐标
    save007(N, D);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

低冷dl

喜欢您来~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值