题目
思路
主要是一个一个找起始点,然后从这个起始点开始,用bfs搜索,如果符合条件了,就跳出循环,yes,都是用勾股定理判断距离
代码
唉,找不到原题的提交页面了,也布吉岛自己写的对不对(肯定不对哈哈哈),但是思路都是一样的,就先这样子吧。。
#include <iostream>
#include <cstring>
#include <stack>
#define MAXX 1005
using namespace std;
struct node
{
int x, y;
} road[MAXX];
bool vis[MAXX];
int n, d;
int f;
//如果可以,从这个点开始搜索
void dfs(int i)
{
memset(vis,0,sizeof vis);
vis[i] = 1;
stack<node> s;
s.push(node{road[i].x,road[i].y});
while (!s.empty())
{
int tx = s.top().x;
int ty = s.top().y;
if ((tx-d<=-50)||(tx+d>=50)||(ty-d<=-50)||(ty+d>=50))
{
f=1;
return;
}
s.pop();
for (int j = 0; j < n; ++j)
{
if (!vis[j])
{
int d1 = (tx-road[j].x)*(tx-road[j].x);
int d2 = (ty-road[j].x)*(ty-road[j].y);
if (d1+d2 <= d*d)
{
s.push(node{road[j].x,road[j].y});
vis[j] = 1;
}
}
}
}
}
int main()
{
cin >> n >> d;
for (int i = 0; i < n; ++i)
{
cin >> road[i].x >> road[i].y;
}
for (int i = 0; i < n; ++i)
{
if ((road[i].x * road[i].x + road[i].y * road[i].y) <= ((d + 7.5) * (d + 7.5)))
dfs(i);
if (f == 1)
break;
}
if (f == 0)
cout << "No" << endl;
else
cout << "Yes" << endl;
return 0;
}