• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
MZQ667
博客园    首页    新随笔    联系   管理    订阅  订阅

[Luogu] P3958 奶酪

Luogu P3958 奶酪


传送门

这个题暴力可过【手动微笑】。好像据我知道的有BFS啦,DFS啦,还有并查集。不管你怎么写,反正我写的DFS【再次手动微笑】。首先读入数据,遍历每一个未访问的空洞进行DFS,再按距离判断哪个空洞可以继续到达,最后判断圆心高度加半径是否大于等于奶酪高度即可(即\(hole[i].z + r \geqslant h\))。哎,可怜一个水题,我竟然考场上爆炸,还是太水啦。

#include <algorithm>
#include <cstdio>
#include <cmath>
typedef long long ll;
int T, n, h, r, stp, vis[1001];
bool fnd;
double tmp;
struct che{
	int x, y, z;
	bool operator < (const che &chi)const{return z < chi.z;}
}c[1001];
inline double dist(int now, int i) {
	return sqrt(double(c[now].x - c[i].x) * (c[now].x - c[i].x) + 
	double(c[now].y - c[i].y) * (c[now].y - c[i].y) +
	double(c[now].z - c[i].z) * (c[now].z - c[i].z));
}
void dfs(int now) {
	if(c[now].z + r >= h) {
		fnd = true;
		return ;
	}
	vis[now] = stp;
	for (int i = 1; i <= n; ++i) {
		tmp = dist(now, i);
		if(tmp <= r * 2 && vis[i] != stp && !fnd)
			dfs(i);
	}
	return ;
}
void solve() {
	fnd = false;
	scanf("%d%d%d", &n, &h, &r);
	for (int i = 1; i <= n; ++i)
		scanf("%d%d%d", &c[i].x, &c[i].y, &c[i].z);
	std::sort(c + 1, c + n + 1);
	for (int i = 1; i <= n; ++i) 
		if(!fnd && std::abs(c[i].z) - r <= 0 && vis[i] != stp)
			dfs(i);
	if(fnd) printf("Yes\n");
	else printf("No\n");
	return ;
}
int main() {
	scanf("%d", &T);
	while(T--) {
		stp++;
		solve();
	}
	return 0;
} 
知识共享许可协议
本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
posted @ 2018-03-06 17:54  mzq667  阅读(138)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3