问题在于保存James Bond。我的代码只在某些特殊情况下得到正确答案。我花了很多时间,但我的算法中没有发现任何错误。我需要你的帮助。感谢。
以下是问题的要求。
.......................................
这次让我们考虑一下电影中的情况" Live and Let Die"其中詹姆斯邦德是世界上最着名的间谍,被一群毒贩抓获。他被送到一个充满鳄鱼的湖中心的一小块土地上。他在那里表演了最大胆的逃跑行动 - 他跳到最近的鳄鱼头上!在动物意识到发生了什么事之前,詹姆斯再次跳到下一个大头上......最后他到达了银行,最后一条鳄鱼咬了他(实际上这个特技演员被大嘴抓住,几乎没有用他的特厚靴子逃脱)。
假设湖面是100乘100平方。假设湖的中心位于(0,0),东北角位于(50,50)。中央岛是一个以(0,0)为中心的圆盘,直径为15.许多鳄鱼都在湖中的不同位置。考虑到每只鳄鱼的坐标和詹姆斯可以跳跃的距离,你必须告诉他是否可以逃脱。
输入规范:
每个输入文件包含一个测试用例。每个案例都以包含两个正整数N(<= 100),鳄鱼数量和D,詹姆斯可以跳跃的最大距离的行开始。然后是N行,每行包含鳄鱼的(x,y)位置。请注意,没有两条鳄鱼停留在同一个位置。
输出规格:
对于每个测试用例,请在一行中打印&#34;是&#34;如果詹姆斯可以逃脱,或者#34;不&#34;如果没有。
示例输入1:
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
示例输出1:
是
示例输入2:
4 13
-12 12
12 12
-12 -12
<12> 12 -12示例输出2:
没有
.......................................
这是我的代码。
#include <stdio.h>
#include <malloc.h>
#include <math.h>
typedef struct Node{
int x;
int y;
} Position;
int result;
Position beast[1000];
int visited[1000];
int NumOfB, JumpAb;
void dfs(int i){
int j;
if (Available(i)){
visited[i]=1;
if (Save(i)) {
result = 1;
printf("Yes");
}
}
for(j = 0;j<NumOfB;j++)
if(!visited[j])
dfs(j);
}
int Available(int i){
int j;
double d_x,d_y;
for (j=0;j<NumOfB;j++){
d_x = beast[i].x - beast[j].x;
d_y = beast[i].y - beast[j].y;
if (((d_x*d_x+d_y*d_y)<JumpAb*JumpAb)&& visited[j]==1){
return 1;
}
}
return 0;
}
int Save(int i){
if ((abs(50-abs(beast[i].x))<=JumpAb)||((abs(50-abs(beast[i].y)))<=JumpAb))
return 1;
else
return 0;
}
int FirstJump(int i){
if (((beast[i].x*beast[i].x)+(beast[i].y*beast[i].y))<=JumpAb*JumpAb){
return 1;
} else {
return 0;
}
}
int main(){
result = 0;
scanf("%d %d",&NumOfB,&JumpAb);
int i;
Position* p =NULL;
for (i=0;i<NumOfB;i++){
p = (Position*)malloc(sizeof(Position));
scanf("%d %d",&p->x,&p->y);
}
for (i=0;i<NumOfB;i++){
visited[i] = 0;
}
for(i = 0;i<NumOfB;i++){
if(!visited[i] && FirstJump(i)){
visited[i] = 1;
dfs(i);
}
}
if (result==0){
printf("No");
}
return 0;
}