基础实验6-2.3 拯救007 (25分)-DFS

 

 

 

 

 

 解题思路:采用DFS算法判断007是否能够逃生,每次先判断是否能够上岸,如若不能上岸再选取下一跳的落脚点,注意到第一跳的半径是D+7.5,而其他跳半径为D

#include <stdio.h>
#include <math.h>
#include <string.h>
int tag=0;
int n,d;
typedef struct {
    int x,y;
} Index;
Index D[1001];
int visit[1001];
int IsSafe(int x) {//判断是否安全上岸
    if(D[x],x-d<=-50||D[x].x+d>=50||D[x].y-d<=-50||D[x].y+d>=50)
        return 1;
    return 0;
}
int Jump(int i,int j) {//判断能否跳到下一个鳄鱼脑袋上
    int p1=(D[i].x-D[j].x)*(D[i].x-D[j].x);
    int p2=(D[i].y-D[j].y)*(D[i].y-D[j].y);
    if(p1+p2<=d*d)
        return 1 ;
    return 0;
}
int FirstJump(int x,int y) {//第一跳
    if(pow(x,2)+pow(y,2)<=pow(d+7.5,2))
        return 1;
    return 0;
}
int DFS(int x) {
    visit[x]=1;
    int i;
    if(IsSafe(x)) {
        tag=1;
        return;
    } else {
        for(i=0; i<n; i++) {
            if(!visit[i]&&Jump(x,i)) {
                DFS(i);
            }
        }
    }
}
int main() {
    scanf("%d %d",&n,&d);
    int i,j;
    for(i=0; i<n; i++) {
        scanf("%d %d",&D[i].x,&D[i].y);
    }
    if(d>=50) {
        printf("Yes\n");
    } else {
        memset(visit,0,sizeof(visit));
        for(i=0; i<n; i++) {
            if(!visit[i]&&FirstJump(D[i].x,D[i].y)) {
                DFS(i);
            }
        }
        if(!tag)
            printf("No\n");
        else printf("Yes\n");
    }
    return 0;
}

 

posted @ 2020-04-02 20:27  跃鱼  阅读(1097)  评论(0编辑  收藏  举报