洛谷 P3958奶酪

    科技2023-09-16  109

    1.分析

    由于是学习深搜,直接就用深搜做了,感觉挺简单,有点判断图的连通性的问道。

    2.代码

    1.前两次提交

    第一次提交,就过了两个点,莫名奇妙的,然后见了剪了一下枝,突然就能过8个点了。

    2.AC代码

    后来做不出来,看了下题解,发现是因为没有注意到原题中数据的范围导致错误,把数据类型都换成长整型之后,顺利AC

    #include <iostream> #include <algorithm> #include <stdlib.h> #include <cstring> #include <stdio.h> using namespace std; typedef long long ll; ll T,N,H,R; struct circle { ll x,y,z; ll r; bool isConnected(circle b) { return (x-b.x)*(x-b.x)+(y-b.y)*(y-b.y)+(z-b.z)*(z-b.z)<=(r+b.r)*(r+b.r); } bool isBottom() { return z-r<=0; } bool isTop() { return z+r>=H; } }; int flag; circle a[1001]; int isVisited[1001]; void dfs(circle c) { if(c.isTop()) { cout<<"Yes\n"; flag=1; return; } for (int i = 1; i <= N; i++) { if(!isVisited[i]&&c.isConnected(a[i])&&!flag ) { isVisited[i]=1; dfs(a[i]); } } } void solve() { int i; for ( i = 1; i <= N; i++) { if(!isVisited[i]&&a[i].isBottom()&&!flag) { isVisited[i]=1; dfs(a[i]); } } } int main() { cin>>T; while (T--) { cin>>N>>H>>R; for (int i = 1; i <= N; i++) { cin>>a[i].x>>a[i].y>>a[i].z; a[i].r=R; } flag=0; memset(isVisited,0,sizeof(isVisited)); solve(); if(!flag) { cout<<"No\n"; } } }
    Processed: 0.018, SQL: 8