NOIP2017提高组day2T1题解(奶酪)
题目链接:奶酪
这道题还是很水的,在下拿了满分。
并没有用什么高级的算法,我讲一下基本思路。
我们把每个洞都视为一个节点。
我们读入相关数据后,就先进行预处理,通过每个节点的信息和题目的规定,建立一张无向图,两个能相通的洞对应的节点之间有一条无向边,这样我们就建立好了一张图。
在建图的时候,我们还需要干一件事,那就是记录哪些是起点,哪些是终点。
接下来我们就对每一个节点进行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题解(奶酪)的更多相关文章
- 【题解】NOIP2017 提高组 简要题解
[题解]NOIP2017 提高组 简要题解 小凯的疑惑(数论) 不讲 时间复杂度 大力模拟 奶酪 并查集模板题 宝藏 最优解一定存在一种构造方法是按照深度一步步生成所有的联通性. 枚举一个根,随后设\ ...
- NOIP2017[提高组] 宝藏 题解
解析 我们观察范围可以发现n非常的小,(一般来说不是搜索就是状压dp)所以说对于这题我们可以用记忆化搜索或者dp,我们发现起点不同那么最终答案也就不同,也就是说答案是跟起点有关的,于是我们便可以想到去 ...
- [NOIp2017提高组]列队
[NOIp2017提高组]列队 题目大意 一个\(n\times m(n,m\le3\times10^5)\)的方阵,每个格子里的人都有一个编号.初始时第\(i\)行第\(j\)列的编号为\((i-1 ...
- JZOJ 5196. 【NOIP2017提高组模拟7.3】B
5196. [NOIP2017提高组模拟7.3]B Time Limits: 1000 ms Memory Limits: 262144 KB Detailed Limits Goto Pro ...
- JZOJ 5197. 【NOIP2017提高组模拟7.3】C
5197. [NOIP2017提高组模拟7.3]C Time Limits: 1000 ms Memory Limits: 262144 KB Detailed Limits Goto Pro ...
- JZOJ 5195. 【NOIP2017提高组模拟7.3】A
5195. [NOIP2017提高组模拟7.3]A Time Limits: 1000 ms Memory Limits: 262144 KB Detailed Limits Goto Pro ...
- JZOJ 5184. 【NOIP2017提高组模拟6.29】Gift
5184. [NOIP2017提高组模拟6.29]Gift (Standard IO) Time Limits: 1000 ms Memory Limits: 262144 KB Detailed ...
- 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 ...
- NOIP2017提高组 模拟赛15(总结)
NOIP2017提高组 模拟赛15(总结) 第一题 讨厌整除的小明 [题目描述] 小明作为一个数学迷,总会出于数字的一些性质喜欢上某个数字,然而当他喜欢数字k的时候,却十分讨厌那些能够整除k而比k小的 ...
随机推荐
- java面试:手写代码
二分查找法. /** * 二分查找法:给定一组有序的数组,每次都从一半中查找.直到找到要求的数据. * 主要是得找到下标的表示方法. */ public class BinaryFind { /** ...
- 全国高校绿色计算大赛 预赛第一阶段(C++)第4关:计算日期
挑战任务 我们吃的食物都有保质期,现在食品监督管理局想要制作一个能准确计算食品过期日期的小程序,需要请你来进行设计. 例如:A食品在2018年1月1日生产,保质期是20天,则它的过期日期在2018年1 ...
- Hudson 打包部署到Was上特别慢
一.找问题点 1.打包很快,到部署很慢 2.部署到其他was一样很慢 二.解决 经过寻找,网上找出以下一段话: 问题出在web.xml,web.xml中的版本信息不对,要根据你的servlet版本和运 ...
- PAT1018 (dijkstra+dfs)
There is a public bike service in Hangzhou City which provides great convenience to the tourists fro ...
- MySQL千万级数据分区存储及查询优化
作为传统的关系型数据库,MySQL因其体积小.速度快.总体拥有成本低受到中小企业的热捧,但是对于大数据量(百万级以上)的操作显得有些力不从心,这里我结合之前开发的一个web系统来介绍一下MySQL数据 ...
- 一字一句的搞懂vue-cli之vue webpack template配置
webpack--神一样的存在.无论写了多少次,再次相见,仍是初见.有的时候开发vue项目,对尤大的vue-cli感激涕零.但是,但是,但是...不是自己的东西,真的很不想折腾.所以,我们就得深入内部 ...
- swift4.2 打印所有系统字体
func showAllFonts(){ let familyNames = UIFont.familyNames var index:Int = 0 for familyName in family ...
- tomcat-maven-plugin的使用
maven有一个把web应用部署到tomcat下的插件 tomcat-maven-plugin , 我们可以使用这个插件把web应用一键式的部署到一个远程的tomcat中. 插件的url: http: ...
- 关于vue的npm run dev和npm run build
├─build │ ├─build.js │ ├─check-versions.js │ ├─dev-client.js │ ├─dev-server.js │ ├─utils.js │ ├─vue- ...
- FOR ALL ENTRIES的使用
使用FOR ALL ENTRIES时注意: 1.一定要确定要有是否为空的判断 2.一定要注明两个表之间数据的关系 eg: IF GT_TJ30T[] IS NOT INITIAL. SELE ...