奶酪(洛谷P3958)

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
double x[1001],y[1001],z[1001];
bool book[1001];
int n,h,r;
bool flag;
double dist(double x1,double y1,double z1,double x2,double y2,double z2){
    return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(z1-z2)*(z1-z2));//求空間內兩點距離公式
}
void dfs(int ball)
{
    if(flag) return;
    if(z[ball]+r>=h){//找到頂部出口
        printf("Yes\n");
        flag=1;
        return;
    }
    book[ball]=1;
    for(int i=1;i<=n;i++){
        if(flag) return;//避免重複去走,會TLE
        if(dist(x[ball],y[ball],z[ball],x[i],y[i],z[i])<=r<<1&&!book[i]) dfs(i);//兩洞中心距離小於2倍半徑,則兩洞相通
    }
}
int main()
{
    int t;
    scanf("%d",&t);
    for(int i=1;i<=t;i++){
        scanf("%d%d%d",&n,&h,&r);
        flag=0;
        memset(book,0,sizeof(book));//初始化
        for(int i=1;i<=n;i++){
            scanf("%lf%lf%lf",&x[i],&y[i],&z[i]);
            if(z[i]<=r) book[i]=1;//判斷底部入口
        }
        for(int i=1;i<=n;i++){
            if(flag) break;
            else if(book[i]) dfs(i);
        }
        if(!flag) printf("No\n");//若是沒找到出口,則輸出No
    }
    return 0;
}

  NOIP2017提升組次日第一題。其實就是簡單的DFS,由於只要判斷Yes和No,寫好一點就能夠了。總用時88ms。ios

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息