06-图2 Saving James Bond - Easy Version(25 point(s))

题目位置
只是一道图的抽象问题,没有难度.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef struct Position *Crocodile;
typedef struct Position *NodeCrocodile;
struct Position{
    int order;
    double x;
    double y;
    Crocodile Next;
}crocodiles[100];
int N,D;
int true=1,false=0;
double diameter=15;
void initialize();
void ADFS();
void DFS(Crocodile C);
int Reached(NodeCrocodile C1,NodeCrocodile C2);
void Link(NodeCrocodile C1,NodeCrocodile C2);
void endReached(int order);
int ViewTure[100];
int flag = 0;
int main(){
    scanf("%d %d",&N,&D);
    int i;
    for(i=0;i<N;i++){
        scanf("%lf %lf",&crocodiles[i].x,&crocodiles[i].y);
    }
    initialize();
    for(i=0;i<N;i++){
        ViewTure[N]=false;
    }
    ADFS();
    if(flag==true)printf("Yes");
    else printf("No");
}
void ADFS(){
    int i;
    int X,Y,Total;
    for(i=0;i<N;i++){
        X=crocodiles[i].x*crocodiles[i].x;
        Y=crocodiles[i].y*crocodiles[i].y;
        Total=X+Y;
        if(Total<=(7.5+D)*(7.5+D))if(ViewTure[crocodiles[i].order]==false)
        DFS(&crocodiles[i]);
    }
}
void DFS(Crocodile C){
    if(flag==true)return;
    while(C){
        if(ViewTure[C->order]==false){
        ViewTure[C->order]=true,endReached(C->order);
        DFS(&crocodiles[C->order]);
        }
        C=C->Next;
    }
}
void endReached(int order){
    int X = crocodiles[order].x;
    int Y = crocodiles[order].y;
    X=abs(X)+D;
    Y=abs(Y)+D;
    if(X>=50||Y>=50){
        flag=true;
    }
}
void initialize(){
    int i,j;
    for(i=0;i<N;i++){
        crocodiles[i].Next=NULL;
        crocodiles[i].order=i;
    }
    for(i=0;i<N;i++){
        for(j=i+1;j<N;j++){
            if(Reached(&crocodiles[i],&crocodiles[j])){
                Link(&crocodiles[i],&crocodiles[j]);
                Link(&crocodiles[j],&crocodiles[i]);
            }
        }
    }
}
int Reached(NodeCrocodile C1,NodeCrocodile C2){
    double X,Y,Total1,Total2;
    X=abs(C1->x-C2->x);
    Y=abs(C1->y-C2->y);
    Total1=X*X+Y*Y;
    Total2=D*D;
    if(Total2>=Total1)return true;
    else return false;
}
void Link(NodeCrocodile C1,NodeCrocodile C2){
    Crocodile C=C1->Next,temp;
    if(C1->Next==NULL){
        C=(Crocodile)malloc(sizeof(struct Position));
        C->Next=NULL;
        C->order=C2->order;
        C1->Next=C;
    }
    else{
        while(C->Next){
         C=C->Next;
        }
        temp=(Crocodile)malloc(sizeof(struct Position));
        temp->Next=NULL;
        temp->order=C2->order;
        C->Next=temp;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值