zoukankan      html  css  js  c++  java
  • 【HDU

    -->Find a way

    直接上Chinese

     Descriptions:

    hsj和lsh最近迷上了pokemon go的游戏。在双十一大物期中考试来临之前,他们想抓一只稀有土拨鼠来攒攒人品(因为土拨鼠的刷新地点最近来到了哈工程)
    但是由于土拨鼠过于强大,他的雷霆半月斩以及惊天浪涛沙都可以轻松的将他们两击败,但是他们两的合击必杀技流影电光闪以及天羽屠鼠舞可以将土拨鼠打至昏迷状态,并可将其捕获。
    但是因为这是款按时间付费的游戏,他们需要尽快捕捉到土拨鼠(即他们两到土拨鼠的时间之和需要最少),因此他们找到了你来帮他们解决这个问题。 规定每走一步需要花费11分钟。

    Input

    输入存在多组(需使用!=EOF)
    每组的第一行有两个整数n,m(2<=n,m<=200)
    接下来n行,每行包括m个字符
    ‘Y’表示hsj所在的位置
    ‘M’表示lsh所在的位置
    ‘.’表示可以通过的地方
    ‘#’表示教学楼即不能走的地方
    ‘@’表示稀有土拨鼠刷新的地方(地图中存在多只稀有土拨鼠)
    Output

    对于每组样例输出他们到达土拨鼠刷新点的最小时间总和。
    保证每组样例都存在一个土拨鼠刷新点,他们两都能到达 
    Sample Input

    4 4
    Y.#@
    ....
    .#..
    @..M
    4 4
    Y.#@
    ....
    .#..
    @#.M
    5 5
    Y..@.
    .#...
    .#...
    @..M.
    #...#

    Sample Output

    66
    88
    66

    题目链接:

    https://vjudge.net/problem/HDU-2612

    这可以说是一题两个bfs

    分别求出Y、M在这张地图所有地方的所用时间,再求出在"@"地方的时间的最小值即可

    具体操作看代码

    AC代码

    #include <iostream>
    #include <cstdio>
    #include <fstream>
    #include <algorithm>
    #include <cmath>
    #include <deque>
    #include <vector>
    #include <queue>
    #include <string>
    #include <cstring>
    #include <map>
    #include <stack>
    #include <set>
    #include <sstream>
    #define mod 1000000007
    #define eps 1e-6
    #define ll long long
    #define INF 0x3f3f3f3f
    #define MEM(x,y) memset(x,y,sizeof(x))
    using namespace std;
    int T,n,m;
    char mp[1005][1005];//原始地图
    int vis[1005][1005];//记录人是否走过
    int ytime[1005][1005];//Y 经过这个地方的时间
    int mtime[1005][1005];//M 经过这个地方的时间
    int dt[][2]= {{1,0},{-1,0},{0,1},{0,-1}};//四个方向
    struct node
    {
        int x,y;//坐标
    };
    node now,net;
    node Y,M;
    void bfs(int f)//
    {
        queue<node>q;
        MEM(vis,0);//都要初始化,都没走过,设为0
        if(f==0)// Y的情况
        {
            MEM(ytime,INF);
            q.push(Y);
            vis[Y.x][Y.y]=1;
            ytime[Y.x][Y.y]=0;
        }
        if(f==1)// M的情况
        {
            MEM(mtime,INF);
            q.push(M);
            vis[M.x][M.y]=1;
            mtime[M.x][M.y]=0;
        }
        while(!q.empty())// bfs 一样的套路
        {
            now=q.front();
            q.pop();
            for(int i=0; i<4; i++)//四个方向
            {
                net.x=now.x+dt[i][0];
                net.y=now.y+dt[i][1];
                if(net.x>=0&&net.x<n&&net.y>=0&&net.y<m&&!vis[net.x][net.y]&&mp[net.x][net.y]!='#')//满足条件
                {
                    q.push(net);//入队
                    vis[net.x][net.y]=1;//走过了
                    if(f==0)//Y 的路线时间
                        ytime[net.x][net.y]=ytime[now.x][now.y]+1;
                    if(f==1)//M 的路线时间
                        mtime[net.x][net.y]=mtime[now.x][now.y]+1;
                }
            }
        }
    }
    int main()
    {
        while(cin>>n>>m)
        {
            for(int i=0; i<n; i++)
            {
                for(int j=0; j<m; j++)
                {
                    cin>>mp[i][j];
                    if(mp[i][j]=='Y')
                    {
                        Y.x=i;
                        Y.y=j;
                    }
                    if(mp[i][j]=='M')
                    {
                        M.x=i;
                        M.y=j;
                    }
                }
            }
            bfs(0); //Y的路线
            bfs(1); //M的路线
            int ans=INF; //最小步数
            for(int i=0; i <n; i++)//搜一遍地图,看一下"@"所在地方的时间之和,取最小值
                for(int j=0; j<m; j++)
                    if(mp[i][j]=='@')
                        ans=min(ans,ytime[i][j]+mtime[i][j]);
            cout<<11*ans<<endl;
        }
        return 0;
    }
  • 相关阅读:
    [NOIP模拟赛][贪心]奶牛晒衣服.
    BZOJ3750: [POI2015]Piecz
    BZOJ2348 [Baltic 2011]Plagiarism
    高精度乘法【高乘高
    codevs 1215 迷宫
    变量交换
    a+b问题与圆柱体表面积的计算
    算数表达式的练习
    [bzoj1070][SCOI2007]修车[ 网络流]
    [bzoj2502]清理雪道[上下界网络流]
  • 原文地址:https://www.cnblogs.com/sky-stars/p/11140928.html
Copyright © 2011-2022 走看看