2019/9/27 题解:【P3958】 奶酪
题解:【P3958】 奶酪
题目:
传送门:https://www.luogu.org/problem/P3958
AC代码:DFS
1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<cmath> 6 using namespace std; 7 int n,outfg,cnt,anst; 8 double h,r; 9 int ans[1005]; 10 struct node 11 { 12 double x; 13 double y; 14 double z; 15 int vis; 16 }p[1005]; 17 bool cmp(node a,node b) 18 { 19 return a.z<b.z; 20 } 21 double dis(node a,node b) 22 { 23 double x1=a.x, x2=b.x, y1=a.y, y2=b.y, z1=a.z, z2=b.z; 24 return sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)+(z2-z1)*(z2-z1)); 25 } 26 void dfs(int x) 27 { 28 if(p[x].z+r>=h)//边界 29 { 30 outfg=1; 31 return; 32 } 33 p[x].vis=1; 34 for(int i=1;i<=n;i++) 35 { 36 double d=dis(p[x],p[i]); 37 if(d==0) 38 continue; 39 if(outfg==1) 40 return ; 41 if(p[i].vis==0) 42 { 43 if(d<=r*2) 44 { 45 dfs(i); 46 } 47 } 48 } 49 } 50 int main() 51 { 52 int t; 53 scanf("%d",&t); 54 anst=t; 55 while(t--) 56 { 57 outfg=0; 58 scanf("%d %lf %lf ",&n,&h,&r); 59 for(int i=1;i<=n;i++) 60 p[i].vis=0; 61 for(int i=1;i<=n;i++) 62 { 63 scanf("%lf %lf %lf",&p[i].x,&p[i].y,&p[i].z); 64 } 65 sort(p+1,p+n+1,cmp); 66 for(int i=1;i<=n;i++) 67 { 68 if(outfg==1) 69 break; 70 if(p[i].z<=r) 71 dfs(i); 72 } 73 if(outfg==1) 74 ans[anst-t]=1; 75 else ans[anst-t]=0; 76 } 77 for(int i=1;i<=anst;i++) 78 if(ans[i]==1) 79 printf("Yes\n"); 80 else if(ans[i]==0) 81 printf("No\n"); 82 return 0; 83 }
重点(坑):
1.别闲的没事干往函数里面传结构体
个人理解传结构体原理是先将结构体复制一遍再进行操作,原结构体数据不改变(debug : 2.5h)
2.别清除访问标记
亲测导致部分数据无限循环//50%AC,50%TLE(debug:0.5h)
//噎死纪念