版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/grooowing/article/details/44901717
http://www.patest.cn/contests/mooc-ds2015spring/06-图2
本题的意思即从某处出发,然后DFS看能否到达某个状态。
可以将鳄鱼看成图,小岛是出发点,陆地是终点(递归出口)。
出发点即寻找可以跳上去的鳄鱼。与上一篇博客http://blog.csdn.net/grooowing/article/details/44900957
void dfscom()很像(遍历图,但是图非联通)
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
//数组大小
#define size 100
//小岛半径
#define radius 7.5
//从文件读取或是。。
#define file 0
typedef struct{
int x,y;
}Point;
bool visited[size];
Point point[size];
//007的步长
int step;
//鳄鱼数量
int number;
//原点坐标
Point origin;//need init
//两点距离,一开始忘了sqrt...
double dist(Point a,Point b){
return sqrt((a.x-b.x)*(a.x-b.x)+
(a.y-b.y)*(a.y-b.y));
}
//是否可以从小岛跳到鳄鱼x上,注意条件if
bool isfirst(Point x){
double r=dist(x,origin);
//printf("r:%.2lf\n",r);
if(r-radius>step)return false;
return true;
}
//鳄鱼x上是否可以跳到岸上
bool issaved(Point x){
if(50-abs(x.x)<=step || 50-abs(x.y)<=step)
return true;
return false;
}
//DFS,注意递归出口是从某鳄鱼可以跳到陆地
bool DFS(int x){
//DFS递归出口易错
bool res=false;
int i;
visited[x]=true;
if(issaved(point[x])){
return true;
}
for(i=0;i<number;i++){
if(!visited[i]&&dist(point[x],point[i])<=step){
//绝对不可以写
//return DFS(i);
//相当于for(i=0;i<n;i++)return i;
//除了i为0时会return出来,其他的不会return
//事实上出口是return true。当res为false时,还要继续
res=DFS(i);
if(res)return true;
}
}
return false;
}
//出发啦
bool dfscom(){
bool res=false;
int i;
for(i=0;i<number;i++){
if(!visited[i]&&isfirst(point[i])){
res=DFS(i);
if(res)return true;
}
}
return false;
}
int main(){
origin.x=origin.y=0;
FILE *fp;
int i;
for(i=0;i<100;i++)
visited[i]=false;
if(file){
fp=fopen("in2.txt","r");
if(fp==NULL){
puts("ERROR fopen!");
return -1;
}
fscanf(fp,"%d%d",&number,&step);
for(i=0;i<number;i++){
fscanf(fp,"%d%d",&point[i].x,&point[i].y);
//printf("%d %d\n",point[i].x,point[i].y);/////
}
}
else{
scanf("%d%d",&number,&step);
for(i=0;i<number;i++){
scanf("%d%d",&point[i].x,&point[i].y);
}
}
if(dfscom())
puts("Yes");
else
puts("No");
return 0;
}