BFS 50分求助万能的谷民
查看原帖
BFS 50分求助万能的谷民
827018
zhouzihang1楼主2023/10/4 17:08

思路是先建图再在图上bfs,50分,WA

#include <iostream>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <vector>
#include <string>
#include <cstring>
#include <cmath>
#include <bits/stdc++.h>
#define mp(a,b) make_pair(a,b)
#define ll long long
using namespace std;
const int N=1e3+10;
struct Jerry{
	int x,y,z;
}a[N];
int n,h,r;
bool up[N],vis[N];
vector<int> down,vc[N];
queue<int> q;
ll Len(int u,int v)
{
	ll x,y,z;
	x=a[u].x-a[v].x;x*=x;
	y=a[u].y-a[v].y;y*=y;
	z=a[u].z-a[v].z;z*=z;
	return x+y+z;
}
//距离^2 
bool checkLen(int u,int v)
{
	return Len(u,v)<=4ll*r*r;
}
//能到return 1
void bfs()
{
	for(auto it:down) q.push(it),vis[it]=1;
	int head;
	while(!q.empty())
	{
		head=q.front();
		q.pop();
		if(up[head])
		{
			printf("Yes\n");
			return;
		}
		for(auto it:vc[head])
		{
			if(!vis[it])
			{
				vis[it]=1;
				q.push(it);
			}
		}
	}
	printf("No\n");
}
void solve()
{
	down.clear();
	for(int i=0;i<N;i++) vc[i].clear();
	memset(up,0,sizeof(up));
	memset(vis,0,sizeof(0));
	while(!q.empty()) q.pop();
	//初始化
	
	scanf("%d%d%d",&n,&h,&r);
	for(int i=1;i<=n;i++)
	{
		scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
		for(int j=1;j<n;j++)
			if(checkLen(i,j))
			{
				vc[i].push_back(j);
				vc[j].push_back(i);
			}
		if(a[i].z-r<=0) down.push_back(i);
		if(a[i].z+r>=h) up[i]=1;
	}
//	cout<<"VC"<<endl;
//	for(int i=1;i<=n;i++)
//	{
//		for(auto it:vc[i]) cout<<it<<' ';
//		cout<<endl;
//	}
//	
//	cout<<"UP"<<endl;
//	for(int i=1;i<=n;i++) cout<<up[i]<<' ';
//	cout<<endl;
//	
//	cout<<"DOWN"<<endl;
//	for(auto it:down) cout<<it<<' ';
//	cout<<endl;
	bfs();
}
int main()
{
	int T;
	cin>>T;
	while(T--) solve();
	return 0;
}







2023/10/4 17:08
加载中...