PAT-Saving James Bond - Easy Version (25)
阿新 • • 發佈:2019-01-14
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; }