DFS算法需要改进

时间:2015-04-17 13:42:07

标签: c depth-first-search

问题在于保存James Bond。我的代码只在某些特殊情况下得到正确答案。我花了很多时间,但我的算法中没有发现任何错误。我需要你的帮助。感谢。

以下是问题的要求。

.......................................

这次让我们考虑一下电影中的情况" Live and Let Die"其中詹姆斯邦德是世界上最着名的间谍,被一群毒贩抓获。他被送到一个充满鳄鱼的湖中心的一小块土地上。他在那里表演了最大胆的逃跑行动 - 他跳到最近的鳄鱼头上!在动物意识到发生了什么事之前,詹姆斯再次跳到下一个大头上......最后他到达了银行,最后一条鳄鱼咬了他(实际上这个特技演员被大嘴抓住,几乎没有用他的特厚靴子逃脱)。

假设湖面是100乘100平方。假设湖的中心位于(0,0),东北角位于(50,50)。中央岛是一个以(0,0)为中心的圆盘,直径为15.许多鳄鱼都在湖中的不同位置。考虑到每只鳄鱼的坐标和詹姆斯可以跳跃的距离,你必须告诉他是否可以逃脱。

输入规范:

每个输入文件包含一个测试用例。每个案例都以包含两个正整数N(<= 100),鳄鱼数量和D,詹姆斯可以跳跃的最大距离的行开始。然后是N行,每行包含鳄鱼的(x,y)位置。请注意,没有两条鳄鱼停留在同一个位置。

输出规格:

对于每个测试用例,请在一行中打印&#34;是&#34;如果詹姆斯可以逃脱,或者#34;不&#34;如果没有。

示例输入1:

14 20

25 -15

-25 28

8 49

29 15

-35 -2

5 28

27 -29

-8 -28

-20 -35

-25 -20

-13 29

-30 15

-35 40

12 12

示例输出1:

示例输入2:

4 13

-12 12

12 12

-12 -12

<12> 12 -12

示例输出2:

没有

.......................................

这是我的代码。

#include <stdio.h>
    #include <malloc.h>
    #include <math.h>

    typedef struct Node{
        int x;
        int y;
    } Position;

    int result;
    Position beast[1000];
    int visited[1000];
    int NumOfB, JumpAb;

    void dfs(int i){
        int j;
        if (Available(i)){
            visited[i]=1;
            if (Save(i)) {
                result = 1;
                printf("Yes");
            }
        }
        for(j = 0;j<NumOfB;j++)
            if(!visited[j])
                dfs(j);
    }
    int Available(int i){
        int j;
        double d_x,d_y;
        for (j=0;j<NumOfB;j++){
            d_x = beast[i].x - beast[j].x;
            d_y = beast[i].y - beast[j].y;
            if (((d_x*d_x+d_y*d_y)<JumpAb*JumpAb)&& visited[j]==1){
                return 1;
            }

        }
        return 0;
    }
    int Save(int i){
        if ((abs(50-abs(beast[i].x))<=JumpAb)||((abs(50-abs(beast[i].y)))<=JumpAb))
            return 1;
        else 
            return 0;
    }
    int FirstJump(int i){
        if (((beast[i].x*beast[i].x)+(beast[i].y*beast[i].y))<=JumpAb*JumpAb){
            return 1;
        } else {
            return 0;
        }   
    }
    int main(){
        result = 0;
        scanf("%d %d",&NumOfB,&JumpAb); 
        int i;
        Position* p =NULL;
        for (i=0;i<NumOfB;i++){
            p = (Position*)malloc(sizeof(Position));
            scanf("%d %d",&p->x,&p->y);
        }
        for (i=0;i<NumOfB;i++){
            visited[i] = 0;
        }
        for(i = 0;i<NumOfB;i++){
          if(!visited[i] && FirstJump(i)){
            visited[i] = 1;
            dfs(i);
           }
        }
        if (result==0){
            printf("No");
        }
        return 0;
    }

0 个答案:

没有答案