14 20
25 -15
-25 28
8 49
29 15
-35 -2
5 28
27 -29
-8 -28
-20 -35
-25 -20
-13 29
-30 15
-35 40
12 12
4 13
-12 12
12 12
-12 -12
12 -12
假设这个湖是一个100乘100平方的湖。假设湖的中心位于(0,0),东北角位于(50,50)。中心岛是一个直径为15的圆盘,中心位于(0,0)。许多鳄鱼在湖里的不同位置。考虑到每只鳄鱼的坐标和詹姆斯能跳的距离,你必须告诉他他是否能逃脱。
每个输入文件包含一个测试用例。每一个例子都以一行包含两个正整数N(≤100),鳄鱼的数量,和D,詹姆斯可以跳跃的最大距离。接下来是N行,每行包含鳄鱼的(x,y)位置。请注意,没有两只鳄鱼停留在同一位置。
1.代码
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define MAXN 100
int visited[MAXN] = {0};
//存储鳄鱼坐标的数据结构
struct Crocodile{
int x;
int y;
}G[MAXN];
int N, D; //鳄鱼数,跳跃距离
int Jump(int V1,int V2); //计算007一条能不能成功
int IsSafe(int V); //从v点能否跳上岸
int DFS(int V); //DFS
int FirstJump(int V); //第一跳的可能
void Save007(); //007 主程序
int main(){
int i;
scanf("%d %d", &N, &D);
for( i=0; i<N; i++) {
scanf("%d %d",&G[i].x, &G[i].y); //读入坐标
}
Save007();
//freopen("out.txt","w",stdout);
return 0;
}
int Jump(int V1, int V2){
double d;
int r;
d=sqrt(pow(G[V1].x-G[V2].x, 2)+pow(G[V1].y-G[V2].y, 2));
r = d<=D ? 1 : 0;
return r;
}
int IsSafe(int V){
int r;
r = ((G[V].x<=D-50)||(G[V].y<=D-50)||(G[V].x>=50-D)||(G[V].y>=50-D)) ? 1 : 0;
return r;
}
int DFS(int V){
int answer=0, i;
visited[V] = 1;
if(IsSafe(V))
answer = 1;
else{
for(i=0; i<N; i++)
if(!visited[i] && Jump(V, i)){ //如果联通这个点且没有访问过
answer = DFS(i);
if(answer == 1)
break;
}
}
return answer;
}
int FirstJump(int V){
int answer;
double d;
d=sqrt(pow(G[V].x, 2)+pow(G[V].y, 2));
answer = (d <= D+7.5) ? 1 : 0;
return answer;
}
void Save007(){
int V, answer;
for(V=0; V<N; V++){
if(!visited[V] && FirstJump(V)){
answer = DFS(V);
if(answer == 1)
break;
}
}
if(answer == 1)
printf("Yes");
else
printf("No");
}
2.小结
- 注意,在这个问题的解决中并没有构建图, 而只是使用了一个结构体数组存放鳄鱼的位置。