进阶实验6-3.4 拯救007(升级版) (30分)-BFS

Posted snzhong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进阶实验6-3.4 拯救007(升级版) (30分)-BFS相关的知识,希望对你有一定的参考价值。

技术图片

 

 技术图片

 

 技术图片

 

 解题思路:

1、先按第一跳距离升序

2、合法第一跳加入队列中

3、(广度优先)访问队列中的结点,每访问一个结点并将其可到达的子孙加入队列中,直至访问至某个结点可以到岸结束

#include <stdio.h>
#include <string.h>
#include <math.h>
#define MaxV 100+5
#define INF 0x3f3f3f3f
typedef struct {
    int x,y;
    double firstjump;
} GNode;
GNode G[MaxV];
int Q[MaxV],path[MaxV],dist[MaxV];
int n,D;
int Jump(int i,int j) {//从一个鳄鱼跳到另一个鳄鱼
    if(pow(G[i].x-G[j].x,2)+pow(G[i].y-G[j].y,2)<=pow(D,2))
        return 1;
    return 0;
}
int IsSafe(int i) {//是否可以直接上岸
    if(G[i].x-D<=-50||G[i].x+D>=50)
        return 1;
    if(G[i].y-D<=-50||G[i].y+D>=50)
        return 1;
    return 0;
}
void BFS() {//广度优先
    int u,v,w;
    int front=0,rear=0;
    for(v=0; v<n; v++) {
        if(G[v].firstjump>pow(7.5,2)&&G[v].firstjump<=pow(D+7.5,2)) {//合法第一跳加入队列
            Q[rear++]=v;
            dist[v]=1;
            path[v]=-1;
        }
    }
    while(front<rear) {
        u=Q[front++];//依次访问队列中的结点
        if(IsSafe(u)&&dist[n]==INF) {//如果可以直接上岸,结束
            dist[n]=dist[u]+1;
            path[n]=u;
            break;
        }
        for(w=0; w<n; w++) {
            if(dist[w]==INF&&Jump(u,w)) {//u结点可到达w结点,则w入队
                Q[rear++]=w;
                dist[w]=dist[u]+1;
                path[w]=u;
            }
        }
    }
}
int cmp(GNode a,GNode b) {
    return a.firstjump-b.firstjump;
}
int main() {
    scanf("%d %d",&n,&D);
    int i;
    for(i=0; i<n; i++) {
        scanf("%d %d",&G[i].x,&G[i].y);
        G[i].firstjump=pow(G[i].x,2)+pow(G[i].y,2);
    }
    if(D>=42.5) {
        printf("1
");
        return 0;
    }
    qsort(G,n,sizeof(G[0]),cmp);//第一跳距离升序
    memset(dist,INF,sizeof(dist));
    memset(path,-1,sizeof(path));
    BFS();
    if(dist[n]==INF) {
        printf("0
");
        return 0;
    }
    printf("%d
",dist[n]);
    int u=path[n];
    int tmp[n];
    memset(tmp,-1,sizeof(tmp));
    int k=0;
    while(u!=-1) {
        tmp[k++]=u;
        u=path[u];
    }
    for(i=k-1; i>=0; i--) {//倒序输出路径
        printf("%d %d
",G[tmp[i]].x,G[tmp[i]].y);
    }
    return 0;
}

 

以上是关于进阶实验6-3.4 拯救007(升级版) (30分)-BFS的主要内容,如果未能解决你的问题,请参考以下文章

进阶实验6-3.3 天梯地图 (30分)-Dijkstra

进阶实验8-2.1 逆散列问题 (30分)

进阶实验8-2.3 二叉搜索树的最近公共祖先 (30分)

进阶实验5-3.3 基于词频的文件相似度 (30分)-哈希

进阶实验6-3.2 社交网络图中结点的“重要性”计算 (30分)-dijkstra算法

进阶实验8-2.3 二叉搜索树的最近公共祖先 (30分)