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