题目位置
只是一道图的抽象问题,没有难度.
#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;
}
}