您的位置:首页 > 其它

05-图2. Saving James Bond - Easy Version (25)

2015-08-22 16:07 417 查看
题目地址:http://www.patest.cn/contests/mooc-ds/05-%E5%9B%BE2

题目不难, 就用队列模拟一下就行

中间是 15个单位长 直径 圆, 所以算距离的时候要注意

#include <cstdio>
#include <sstream>
#include <cstring>
#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <algorithm>
#include <sstream>
#include <cmath>
#include <set>
#include <map>
#include <unordered_map>
#include <stack>

using namespace std;

#define N 105
int n, m;

typedef struct mydata{
int x;
int y;
mydata(int _x = 0, int _y = 0)
{
x = _x;
y = _y;
}
}Point;

Point a
;
bool vis
;

// 能否调到岸边
bool isOk(Point p)
{
if (50 - abs(p.x) <= m)
return true;
if (50 - abs(p.y) <= m)
return true;
return false;
}

vector<Point> vok;

// 两点之间的距离 小于等于 m  就行了
bool isCanJmp(Point p1, Point p2)
{
int tmp = (p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y);
if (tmp <= m*m)
return true;
return false;
}

int main()
{
//freopen("in", "r", stdin);
while (scanf("%d%d", &n, &m) != EOF)
{
int i;
Point pt;
a[0].x = 0;
a[0].y = 0;
vok.clear();
for (i = 1; i <= n; i++)
{
scanf("%d%d", &pt.x, &pt.y);
a[i] = pt;
if (isOk(pt))
vok.push_back(pt);
}
if ((int)vok.size() == 0)
{
printf("No\n");
}
else{

for (i = 0; i <= n; i++)
vis[i] = false;

bool flag = false;

queue<int> que;
que.push(0);
vis[0] = true;

while (!que.empty())
{
int nowI = que.front();
que.pop();

if (isOk(a[nowI]))
{
flag = true;
break;
}

for (i = 0; i <= n; i++)
{
if (!vis[i])
{
if (nowI == 0) // 15米diameter(直径)的disk
{
double tmpd = sqrt(a[i].x * a[i].x + a[i].y * a[i].y) - 7.5;
if (tmpd <= m)
{
que.push(i);
vis[i] = true;
}
}
else{
if (isCanJmp(a[nowI], a[i]))
{
que.push(i);
vis[i] = true;
}
}
}
}
}
if (flag)
printf("Yes\n");
else
printf("No\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: