【HDU - 2612】Find a way

-->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;
}

 

上一篇:[USACO07MAR]Face The Right Way G


下一篇:Android中IndexOutOfBoundsException: Inconsistency detected. Invalid item position 1(offset:1).state:4