2017noip奶酪

版权声明:装作自己有版权 https://blog.csdn.net/weixin_44574444/article/details/86599764

2017noip day2 t1

洛谷传送门

题目描述

解题思路:我们只需要找一个与奶酪下表面相连接的一个空洞,找一个与这个空洞相连接的空洞,再跑一遍dfs判断最后是否与奶酪的顶部相连通。联通ans++就行(无需要最短)。

本题还要注意此题的数据范围和在题干中有个绝对值,我开始在读入优化中就没有考虑负数坐标,100分就直接扣掉了20早知道就该好好将读入优化打完

下面为完整代码

/***********************
*    Problem:P3958 奶酪   *
*    User: mzg1824_TY *
*    Language: C++     *
*    Date:2018.1.21   *
*    algorithm:深度优先搜索		*
**********************/
#include<bits/stdc++.h>
#define ll long long
#define M 1000000+5
using namespace std;

const int maxn=1000+5;
long long x[maxn],y[maxn],z[maxn],vis[maxn];
ll T,n,h,r;
bool ok;

struct node{
	ll x,y,z;
}e[M];//结构体存储空洞数据

void init()
{
	freopen("input.txt","r",stdin);
}

ll read()
{
	ll x=0,f=1;
	char ch=getchar();
	while(ch<'0' || ch>'9'){if(ch=='-') f=-1;ch=getchar();}
	while(ch>='0' && ch<='9'){x=10*x+ch-'0';ch=getchar();}
	return x*f;
}

bool pd(int a,int b)//判断两个空洞是否相邻,相邻则返回真,否则返回假
{
	if((e[a].x-e[b].x)*(e[a].x-e[b].x)+(e[a].y-e[b].y)*(e[a].y-e[b].y)+(e[a].z-e[b].z)*(e[a].z-e[b].z)<=4*(long long)r*r)
	return true;
	else return false;
}

void dfs(int i)
{
	if(ok) return;//跑过了就退出
	vis[i]=true;//染色标记,缩减时间
	if(e[i].z>=h-r)
	{
		ok=true;
		return;//如果到了上表面,也就是小鼠能上去则返回真
	}
	for(ll j=1;j<=n;j++)
	{
		if(vis[j]==0 && pd(i,j))//两个空洞相邻且没有被染色
		{
			dfs(j);
		}
	}
}

bool check()
{
	ok=false;
	memset(vis,0,sizeof(vis));
	for (ll i=1;i<=n;i++)
	{
		if(vis[i]==0 && e[i].z<=r)//如果这个点是下表面,便从这个点起跑。
		{
			dfs(i);
		}
	}
	return ok;
}

void readdata()
{
	int u,v;
	T=read();
	for(ll i=1;i<=T;i++)
	{
		n=read();
		h=read();
		r=read();
		for(ll j=1;j<=n;j++)
		{
			e[j].x=read();
			e[j].y=read();
			e[j].z=read();
		}
		if(check())
			printf("Yes\n");
		else
			printf("No\n");
	}
}

void work()
{
	
}

int main()
{
	init();
	readdata();
	work();
	return 0;
}//希望能够有帮助

猜你喜欢

转载自blog.csdn.net/weixin_44574444/article/details/86599764