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