题目链接:奶酪

这道题还是很水的,在下拿了满分。

并没有用什么高级的算法,我讲一下基本思路。

我们把每个洞都视为一个节点。

我们读入相关数据后,就先进行预处理,通过每个节点的信息和题目的规定,建立一张无向图,两个能相通的洞对应的节点之间有一条无向边,这样我们就建立好了一张图。

在建图的时候,我们还需要干一件事,那就是记录哪些是起点,哪些是终点。

接下来我们就对每一个节点进行bfs就行了,这样就可以了。

我们再结合代码讲解一下:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
//保险起见,没用万能头文件
using namespace std;
//手写队列,用于bfs
struct gque{
int f,t;
int num[1050];
void init(){
f=0;t=0;
}
void gpush(int n){
num[t++]=n;
}
int gtop(){
return num[f];
}
void gpop(){
f++;
}
};
gque q;
int T;
int n,h,r;
//保存图
vector<int> mapp[1005];
//保存起点
vector<int> s;
//保存终点(这样便于判断)
int tvis[1005];
int indd[1005][3];
int vis[1005];
int sflag,tflag;
int flag;
//计算两点距离
long long ggetdist(int xx,int yy,int zz,int xxx,int yyy,int zzz){
long long dist=1LL*(xx-xxx)*(xx-xxx)+1LL*(yy-yyy)*(yy-yyy)+1LL*(zz-zzz)*(zz-zzz);
return dist;
}
//bfs,为了反作弊,用了自己的名字缩写
int cgg(int cur){
q.init();
memset(vis,0,sizeof(vis));
q.gpush(cur);
vis[cur]=1;
while(q.f!=q.t){
int gg=q.gtop();
q.gpop();
for(unsigned int i=0;i<mapp[gg].size();i++){
if(tvis[mapp[gg][i]]){//这样判断比较方便
//如果遍历到了终点,就返回可以
return 1;
}
if(!vis[mapp[gg][i]]){
q.gpush(mapp[gg][i]);
vis[mapp[gg][i]]=1;
}
}
}
//没找到,返回不可以
return 0;
}
int main(){
freopen("cheese.in","r",stdin);
freopen("cheese.out","w",stdout);
scanf("%d",&T);
while(T--){
scanf("%d%d%d",&n,&h,&r);
//读入点的数据
for(int i=0;i<n;i++){
scanf("%d%d%d",&indd[i][0],&indd[i][1],&indd[i][2]);
}
//接下来是一堆初始化,由于是多组数据,这非常重要。
memset(tvis,0,sizeof(tvis));
for(int i=0;i<n;i++){
mapp[i].clear();
}
s.clear();
sflag=0,tflag=0;//用于记录是否有终点和起点
for(int i=0;i<n;i++){
flag=0;//用于判断一个节点是否既是起点又是终点
if(indd[i][2]+r<=0||indd[i][2]-r>=h){
//排除一些无关的节点(即完全在奶酪外面)
continue;
}
if(indd[i][2]<=r&&indd[i][2]>-r){
//存起点
sflag=1;
s.push_back(i);
flag++;
}
if(indd[i][2]>=(h-r)&&indd[i][2]<(h+r)){
//存终点
tvis[i]=1;
tflag=1;
flag++;
}
if(flag==2){
//如果存在一个节点既是起点又是终点,那么就直接输出可以
printf("Yes\n");
break;
}
for(int j=i+1;j<n;j++){
//遍历当前节点是否与其他节点联通(建图)
if(ggetdist(indd[i][0],indd[i][1],indd[i][2],indd[j][0],indd[j][1],indd[j][2])<=1LL*4*r*r){
mapp[i].push_back(j);
mapp[j].push_back(i);
}
}
}
if(flag==2){
//代表问题已经解决
continue;
}
if(!tflag||!sflag){
//如果没有起点或是没有终点,显然不行
printf("No\n");
continue;
}
flag=0;//用于记录是否有解
//开始bfs
for(unsigned int i=0;i<s.size();i++){
//遍历每一个起点
if(cgg(s[i])){
//如果有解记录
flag=1;
break;
}
}
//输出结果
if(flag){
printf("Yes\n");
}else{
printf("No\n");
}
}
return 0;
}

总结:真心不难,非常简单。

NOIP2017提高组day2T1题解(奶酪)的更多相关文章

  1. 【题解】NOIP2017 提高组 简要题解

    [题解]NOIP2017 提高组 简要题解 小凯的疑惑(数论) 不讲 时间复杂度 大力模拟 奶酪 并查集模板题 宝藏 最优解一定存在一种构造方法是按照深度一步步生成所有的联通性. 枚举一个根,随后设\ ...

  2. NOIP2017[提高组] 宝藏 题解

    解析 我们观察范围可以发现n非常的小,(一般来说不是搜索就是状压dp)所以说对于这题我们可以用记忆化搜索或者dp,我们发现起点不同那么最终答案也就不同,也就是说答案是跟起点有关的,于是我们便可以想到去 ...

  3. [NOIp2017提高组]列队

    [NOIp2017提高组]列队 题目大意 一个\(n\times m(n,m\le3\times10^5)\)的方阵,每个格子里的人都有一个编号.初始时第\(i\)行第\(j\)列的编号为\((i-1 ...

  4. JZOJ 5196. 【NOIP2017提高组模拟7.3】B

    5196. [NOIP2017提高组模拟7.3]B Time Limits: 1000 ms  Memory Limits: 262144 KB  Detailed Limits   Goto Pro ...

  5. JZOJ 5197. 【NOIP2017提高组模拟7.3】C

    5197. [NOIP2017提高组模拟7.3]C Time Limits: 1000 ms  Memory Limits: 262144 KB  Detailed Limits   Goto Pro ...

  6. JZOJ 5195. 【NOIP2017提高组模拟7.3】A

    5195. [NOIP2017提高组模拟7.3]A Time Limits: 1000 ms  Memory Limits: 262144 KB  Detailed Limits   Goto Pro ...

  7. JZOJ 5184. 【NOIP2017提高组模拟6.29】Gift

    5184. [NOIP2017提高组模拟6.29]Gift (Standard IO) Time Limits: 1000 ms  Memory Limits: 262144 KB  Detailed ...

  8. JZOJ 5185. 【NOIP2017提高组模拟6.30】tty's sequence

    5185. [NOIP2017提高组模拟6.30]tty's sequence (Standard IO) Time Limits: 1000 ms  Memory Limits: 262144 KB ...

  9. NOIP2017提高组 模拟赛15(总结)

    NOIP2017提高组 模拟赛15(总结) 第一题 讨厌整除的小明 [题目描述] 小明作为一个数学迷,总会出于数字的一些性质喜欢上某个数字,然而当他喜欢数字k的时候,却十分讨厌那些能够整除k而比k小的 ...

随机推荐

  1. 常用的jquerymobil 站点

    http://www.jqmapi.com/api1.2/ Jquery Mobile 中文API站 https://codiqa.com/demo   jquerymobil UI编辑器 https ...

  2. 缩点+最小路径覆盖 hdu 3861

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3861 题意:输入t,表示t个样例.接下来每个样例第一行有两个数n,m表示点数和有向边的数量,接下来输入 ...

  3. Android 性能测试之CPU

    接上一篇 CPU跟内存一样,存在一些测试子项,如下清单所示 1.空闲状态下的应用CPU消耗情况 2.中等规格状态下的应用CPU消耗情况 3.满规格状态下的应用CPU消耗情况 4.应用CPU峰值情况 C ...

  4. e-olymp Problem11 Big accuracy

    传送门:点我 Big accuracy The rational fraction m/n is given. Write it in the decimal notation with k digi ...

  5. 快速了解和使用Photon Server

    https://blog.csdn.net/qq_36565626/article/details/78710787

  6. 不常见的javascript调试技巧

    原文链接:https://segmentfault.com/a/1190000011857058 有时, 有一组复杂的对象要查看.可以通过console.log查看并滚动浏览,亦或者使用console ...

  7. Redis 非关系性数据库集群的搭建与常用方法

    redis 非关系型数据库,内存型数据库,现在大家都不陌生了,无论大中小型企业,都会将redis应用到自己的项目中,以此来减轻数据库的压力 安装步骤: 1.安装gcc 安装c语言的编译环境 yum i ...

  8. JwtBearerAppBuilderExtensions.UseJwtBearerAuthentication(IApplicationBuilder

    netcore从1.1升级到2.0时,出的错,因为使用的时Jwt token参考https://github.com/aspnet/Security/issues/1310#issuecomment- ...

  9. vue2.0生命周期详解

    首先上图展 <template> <div id="home"> <p>{{ message }}</p> </div> ...

  10. axios基本使用

    1,安装axios cnpm install axios --save 2.在main.js里面引入 import axios from 'axios' /*解决在其他组件中不能用*/Vue.prot ...