1. 程式人生 > >PAT-Saving James Bond - Easy Version (25)

PAT-Saving James Bond - Easy Version (25)

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;
}