zoukankan      html  css  js  c++  java
  • 救援行动(save) (BFS)

    时间限制: 1 Sec  内存限制: 64 MB
    提交: 42  解决: 9
    [提交][状态][讨论版]

    题目描述

    Angel被人抓住关在一个迷宫了!迷宫的长、宽均不超过200,迷宫中有不可以越过的墙以及监狱的看守。Angel的朋友带了一个救援队来到了迷宫中。他们的任务是:接近Angel。我们假设接近Angel就是到达Angel所在的位置。
    假设移动需要1单位时间,杀死一个看守也需要1单位时间。到达一个格子以后,如果该格子有看守,则一定要杀死。交给你的任务是,最少要多少单位时间,才能到达Angel所在的地方(只能向上、下、左、右4个方向移动)?

    输入

    第1行两个整数n,m。表示迷宫的大小为n×m。
    以后n行,每行m个字符。其中“#”代表墙,“.”表示可以移动,“x”表示看守,“a”表示Angel,“r”表示救援队伍。字母均为小写。

    输出

    l行,代表救出Angel的最短时间。如果救援小组永远不能达到Angel处,则输出“NO ANSWER”。

    样例输入

    7 8
    #.#####.
    #.a#..r.
    #..#x...
    ..#..#.#
    #...##..
    .#......
    ........
    
    

    样例输出

    13

    【分析】 前期做一些小小的处理,后面就是简单的BFS一下。
    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <time.h>
    #include <string>
    #include <map>
    #include <stack>
    #include <vector>
    #include <set>
    #include <queue>
    #define pi acos(-1.0)
    #define inf 0x3f3f3f3f
    using namespace std;
    int n,m,flag=0;
    int dis[4][2]= {1,0,0,1,-1,0,0,-1};
    int vis[205][205];
    string w[205];
    struct man
    {
        int x,y,step;
    };
    queue<man>q;
    void bfs(man s)
    {
        q.push(s);
        while(!q.empty())
        {
            man t=q.front();
            //printf("%d %d %d
    ",t.x,t.y,t.step);
            if(w[t.x][t.y]=='a'){printf("%d
    ",t.step);flag=1;return;}
            else if(w[t.x][t.y]=='x'){t.step++;q.pop();q.push(t);w[t.x][t.y]='.';continue;}
            q.pop();
            for(int i=0;i<4;i++)
            {
                int xx=t.x+dis[i][0];int yy=t.y+dis[i][1];
                if(xx>=0&&xx<n&&yy>=0&&yy<m&&vis[xx][yy]==0&&w[xx][yy]!='#')
                {
                    man k;
                    vis[xx][yy]=1;
                    k.step=t.step+1;k.x=xx;k.y=yy;q.push(k);
                }
            }
        }
    }
    int main()
    {
        memset(vis,0,sizeof(vis));
        scanf("%d%d",&n,&m);man s;
        for(int i=0;i<n;i++)cin>>w[i];
        for(int i=0; i<n; i++)
            for(int j=0; j<m; j++)
            {
                if(w[i][j]=='r')
                {
     
                    s.x=i;
                    s.y=j;
                    s.step=0;
                }
            }
        bfs(s);
        if(flag==0)printf("NO ANSWER
    ");
        return 0;
    }
    ViewCode
  • 相关阅读:
    hdu 6836
    2019 树形—DP
    2020牛客暑期多校训练营(第六场)
    hdu 6756 Finding a MEX 线段树
    2020 Multi-University Training Contest 2
    spring boot maven 打jar包 不能引入外部jar
    git 操作命令
    homestead 安装swoole
    MYSQL-触发器
    再次认知const
  • 原文地址:https://www.cnblogs.com/jianrenfang/p/5703017.html
Copyright © 2011-2022 走看看