zoukankan      html  css  js  c++  java
  • 基础实验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
    ");
        } 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
    ");
            else printf("Yes
    ");
        }
        return 0;
    }
  • 相关阅读:
    2016年第七届蓝桥杯C/C++ A组国赛 —— 第一题:随意组合
    寻找段落
    攻击火星
    图论入门
    实数加法
    求 10000 以内 n 的阶乘
    大整数因子
    计算2的N次方
    大整数减法
    大整数加法
  • 原文地址:https://www.cnblogs.com/snzhong/p/12622757.html
Copyright © 2011-2022 走看看