【POJ 3026】Borg Maze(BFS+Prime算法)

题目链接:http://poj.org/problem?id=3026

题意:

有一个迷宫,迷宫里面有一些外星人,你需要通过扫描迷宫来同化隐藏在迷宫中的外星人,迷宫里的S是起点,搜索的开始是由多个人组成的,搜索过程中,在外星人处或搜索开始的地方,该群体可能会分成两组或更多组。求同化所有外星人所需要的最小步数。

思路:

刚开始一直在纠结分组是啥意思,为嘛要分组,咋分组才能使成本最小,后来看了大佬的博客才知道这句没啥用,主要是为了把它抽象成最小生成树。

这题可以这样理解,一群外星人在一张地图当中,你有不小于外星人数量的人手,你要找到他们,并且你可以在找到外星人或出发时将人手分成任意两部分(这是不是就有点儿像最小生成树里的Prime算法)。

嗯 ,这样的话,主要问题就在于如何求两点之间的距离了,这类似于迷宫里求起点到终点的距离,因此就需要用bfs算法求迷宫里面两点之间的距离。下面可以结合代码走一遭。

噢   对,这道题里面还藏了一个自我感觉良好的坑,(据说做了这题的娃儿都被它成功坑到了,当然,我也没跑掉)输入迷宫的x,y后面还有些空格,不得不说出题人真的很淘气

My  Code:

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
#include<math.h>
#include<set>
using namespace std;
#define INF 1e9
typedef long long ll;
int dis[105][105],d[105],flag[105],n;
void Prime()///最小生成树
{
    memset(flag,0,sizeof(flag));
    for(int i =1; i <= n; i++)
        d[i] = dis[1][i];
    d[1] = 0;
    flag[1] = 1;
    int ans = 0;
    for(int i = 1; i < n; i++)
    {
        int minn = INF,k;
        for(int j = 1; j <= n; j++)
        {
            if(d[j] < minn && flag[j] == 0)
            {
                minn = d[j];
                k = j;
            }
        }
        flag[k] = 1;
        ans += d[k];
        for(int j = 1; j <= n; j++)
            d[j] = min(d[j],dis[k][j]);
    }
    printf("%d\n",ans);
}
struct point
{
    int x,y,step;
};
int vis[55][55],node[55][55],col,row;
///vis标记是否走过,node用来标记外星人A和起点S
int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
char ch[55][55];
void bfs(int i,int j)///求出每两点之间的距离
{
    memset(vis,0,sizeof(vis));
    point start;
    start.x = i;
    start.y = j;
    start.step = 0;
    vis[start.x][start.y] = 1;
    point cur,nxt;
    queue<point> q;
    q.push(start);
    while(!q.empty())///遍历整个迷宫,求出起点到其他各点的距离
    {
        cur = q.front();
        q.pop();
        if(node[cur.x][cur.y]) dis[node[start.x][start.y]][node[cur.x][cur.y]] = cur.step;///碰到一个点,记录他们俩之间的距离
        for(int i = 0; i < 4; i++)
        {
            nxt.x = cur.x + dir[i][0];
            nxt.y = cur.y + dir[i][1];
            nxt.step = cur.step +1;
            if(nxt.x >= 0 &&nxt.x < row && nxt.y >= 0 && nxt.y < col && ch[nxt.x][nxt.y] != '#' && vis[nxt.x][nxt.y] == 0)
            {
                vis[nxt.x][nxt.y] = 1;
                q.push(nxt);
            }
        }
    }
    return;
}
int main()
{
    int t;
    cin >> t;
    while(t--)
    {
        char s[10000];
        scanf("%d%d",&col,&row);
        gets(s);///注意输入行列后面还有空格,确保自己代码没问题但还是wa的看看是否加了这句
        memset(ch,'\0',sizeof(ch));
        memset(node,0,sizeof(node));
        int cunt = 1;
        for(int i = 0; i < row; i++)
        {
            getchar();///吃掉多余的换行符
            scanf("%[^\n]",ch[i]);
            for(int j =0; j < col; j++)
            {
                if(ch[i][j] == 'S' || ch[i][j] == 'A')
                    node[i][j] = cunt++;
            }
        }
        n = cunt -1;
        for(int i = 0; i < row; i++)
        {
            for(int j = 0; j < col; j++)
            {
                if(node[i][j]) bfs(i,j);///以点(i,j)为起点遍历整个迷宫
            }
        }
        Prime();
    }

    return 0;
}

 

全部评论

相关推荐

bg双非本科,方向是嵌入式。这次秋招一共拿到了&nbsp;8&nbsp;个&nbsp;offer,最高年包&nbsp;40w,中间也有一段在海康的实习经历,还有几次国家级竞赛。写这篇不是想证明什么,只是想把自己走过的这条路,尽量讲清楚一点,给同样背景的人一个参考。一、我一开始也很迷茫刚决定走嵌入式的时候,其实并没有一个特别清晰的规划。网上的信息很零散,有人说一定要懂底层,有人说项目更重要,也有人建议直接转方向。很多时候都是在怀疑:1.自己这种背景到底有没有机会2.现在学的东西到底有没有用3.是不是已经开始晚了这些问题,我当时一个都没答案。二、现在回头看,我主要做对了这几件事第一,方向尽早确定,但不把自己锁死。我比较早就确定了嵌入式这个大方向,但具体做哪一块,是在项目、竞赛和实习中慢慢调整的,而不是一开始就给自己下结论。第二,用项目和竞赛去“证明能力”,而不是堆技术名词。我不会刻意追求学得多全面,而是确保自己参与的每个项目,都能讲清楚:我负责了什么、遇到了什么问题、最后是怎么解决的。第三,尽早接触真实的工程环境。在海康实习的那段时间,对我触动挺大的。我开始意识到,企业更看重的是代码结构、逻辑清晰度,以及你能不能把事情说清楚,而不只是会不会某个知识点。第四,把秋招当成一个需要长期迭代的过程。简历不是一次写完的,面试表现也不是一次就到位的。我会在每次面试后复盘哪些问题没答好,再针对性补。三、我踩过的一些坑现在看也挺典型的:1.一开始在底层细节上纠结太久,投入产出比不高2.做过项目,但前期不会总结,导致面试表达吃亏3.早期有点害怕面试,准备不充分就去投这些弯路走过之后,才慢慢找到节奏。四、给和我背景相似的人一点建议如果你也是双非,准备走嵌入式,我觉得有几件事挺重要的:1.不用等“准备得差不多了”再投2.项目一定要能讲清楚,而不是做完就算3.不要只盯着技术,多关注表达和逻辑很多时候,差的不是能力,而是呈现方式。五、写在最后这篇总结不是标准答案,只是我个人的一次复盘。后面我会陆续把自己在嵌入式学习、竞赛、实习和秋招中的一些真实经验拆开来讲,希望能对后来的人有点帮助。如果你正好也在这条路上,希望你能少走一点弯路。
x_y_z1:蹲个后续
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务