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

    救援行动(save)

    题目描述

    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<cstring>
    #include<algorithm>
    #include<cmath>
    #include<map>
    #include <queue>
    #define ll long long
    #define rep(i,m,n) for(i=m;i<=n;i++)
    #define inf 0x3f3f3f3f
    const int maxn=2e2+10;
    using namespace std;
    int n,m,vis[maxn][maxn];
    const int dis[][2]={0,1,1,0,-1,0,0,-1};
    char a[maxn][maxn];
    bool flag;
    void dfs(int x,int y)
    {
        priority_queue<pair<int,pair<int,int> >,vector<pair<int,pair<int,int> > >, greater<pair<int,pair<int,int> > > >p;
        vis[x][y]=1;p.push(make_pair(1,make_pair(x,y)));
        while(!p.empty())
        {
            pair<int,pair<int,int> > b=p.top();p.pop();
            for(int i=0;i<4;i++)
            {
                int l=b.second.first+dis[i][0],r=b.second.second+dis[i][1];
                if(l>=0&&l<n&&r>=0&&r<m&&!vis[l][r]&&a[l][r]!='#')
                {
                        vis[l][r]=vis[b.second.first][b.second.second]+1+(a[l][r]=='x');
                        p.push(make_pair(vis[l][r],make_pair(l,r)));
                        if(a[l][r]=='a')return;
                }
            }
        }
    }
    int main()
    {
        int i,j,k,t;
        scanf("%d%d",&n,&m);
        rep(i,0,n-1)scanf("%s",a[i]);
        rep(i,0,n-1)rep(j,0,m-1)
        {
            if(a[i][j]=='r'){dfs(i,j);break;}
        }
        rep(i,0,n-1)rep(j,0,m-1)if(a[i][j]=='a')goto loop;
        loop:;
        if(vis[i][j]!=0)printf("%d
    ",vis[i][j]-1);
        else puts("NO ANSWER");
        //system("pause");
        return 0;
    }
  • 相关阅读:
    js--事件
    js之table操作
    2019年目标
    history.back返回后输入框值丢失问题
    C++ 工程师养成 每日一题4.5 (迭代器遍历)
    C++ 工程师养成 每日一题fourth (reverse的使用)
    C++ 工程师养成 每日一题third (子数列排序)
    C++工程师养成 每日一题(string使用)
    C++工程师养成 每日一题(vector使用)
    运算符优先级
  • 原文地址:https://www.cnblogs.com/dyzll/p/5703395.html
Copyright © 2011-2022 走看看