PAT-Saving James Bond - Easy Version (25)

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}




猜你喜欢

转载自blog.csdn.net/grooowing/article/details/44901717