06-图2 Saving James Bond - Easy Version

在这里插入图片描述

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.小结

  • 注意,在这个问题的解决中并没有构建图, 而只是使用了一个结构体数组存放鳄鱼的位置。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值