问题描述:
解题思路:
抽象成一个图,使用dfs遍历编号,被扫到的就标记。为什么是可以是dfs遍历编号,因为扫到人才会在该基础上向小于d的距离感染。下图为抽象的图:
注意点:1.dfs每次枚举的是编号。
2.判断距离是否小于D:数学公式(两点距离):r^2 = (x1 - x2)^2 + (y1 - y2)^2。
3.用编号表示每个仙子,x[i]、y[i]表示其坐标位置 ***
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 9;
int x[N], y[N], vis[N];
int n, d;
// 求两编号距离
double dis(int i, int j){ // 类型不能是int, 取平方根的值可能有小鼠,int会导致向下取整
return sqrt((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j])); //数学公式(两点距离):r^2 = (x1 - x2)^2 + (y1 - y2)^2
}
void dfs(int id){
vis[id] = 1;
for(int i = 1; i <= n; i++){ // 遍历的是编号**
if(dis(id, i) <= d && !vis[i])dfs(i);
}
}
int main()
{
cin >> n;
for(int i = 1; i <= n; i++){
cin >> x[i] >> y[i];
}
cin >> d; // 传播距离自定义
dfs(1);
for(int i = 1; i <= n; i++){
cout << (vis[i] ? '1' : '0') << '\n'; // 三目运算符要加括号,不然不会换行
}
return 0;
}
知识点:图,dfs