• 救援行动(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
  • 相关阅读:
    设计模式之工厂模式-抽象工厂(02)
    1036 跟奥巴马一起编程 (15 分)
    1034 有理数四则运算 (20 分)
    1033 旧键盘打字 (20 分)
    1031 查验身份证 (15 分)
    大学排名定向爬虫
    1030 完美数列 (25 分)二分
    1029 旧键盘 (20 分)
    1028 人口普查 (20 分)
    1026 程序运行时间 (15 分)四舍五入
  • 原文地址:https://www.cnblogs.com/jianrenfang/p/5703017.html
Copyright © 2020-2023  润新知