1. 程式人生 > >HDU-2612-Find a way

HDU-2612-Find a way

fin 捕獲 fir sizeof ret amp second using 時間

鏈接:https://vjudge.net/problem/HDU-2612#author=zhang95986

題意:

hsj和lsh最近迷上了pokemon go的遊戲。在雙十一大物期中考試來臨之前,他們想抓一只稀有土撥鼠來攢攢人品(因為土撥鼠的刷新地點最近來到了哈工程)
但是由於土撥鼠過於強大,他的雷霆半月斬以及驚天浪濤沙都可以輕松的將他們兩擊敗,但是他們兩的合擊必殺技流影電光閃以及天羽屠鼠舞可以將土撥鼠打至昏迷狀態,並可將其捕獲。
但是因為這是款按時間付費的遊戲,他們需要盡快捕捉到土撥鼠(即他們兩到土撥鼠的時間之和需要最少),因此他們找到了你來幫他們解決這個問題。 規定每走一步需要花費11分鐘。

思路:

bfs記錄兩個人到每個土撥鼠點的步數,找到一個和最小的位置。

代碼:

#include <iostream>
#include <memory.h>
#include <vector>
#include <map>
#include <algorithm>
#include <cstdio>
#include <math.h>
#include <queue>
#include <string>

using namespace std;

typedef long long LL;

const int MAXN = 200 + 10;

int Next[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
char Map[MAXN][MAXN];
int vis[MAXN][MAXN];
int res[MAXN][MAXN][2];
int n, m;
struct Node
{
    int _x, _y, _step;
    Node(int x, int y, int step):_x(x), _y(y), _step(step){}
};
vector<pair<int, int> > node;

void Bfs(int sx, int sy, int w)
{
    memset(vis, 0, sizeof(vis));
    queue<Node> que;
    que.push(Node(sx, sy, 0));
    vis[sx][sy] = 1;
    while (!que.empty())
    {
        Node now = que.front();
        if (Map[now._x][now._y] == ‘@‘)
            res[now._x][now._y][w] = now._step;
        que.pop();
        for (int i = 0;i < 4;i++)
        {
            int nx = now._x + Next[i][0];
            int ny = now._y + Next[i][1];
            if (nx < 1 || nx > n || ny < 1 || ny > m)
                continue;
            if (Map[nx][ny] == ‘#‘ || vis[nx][ny] == 1)
                continue;
            que.push(Node(nx, ny, now._step + 1));
            vis[nx][ny] = 1;
        }
    }
}

int main()
{
    int sx1, sy1, sx2, sy2;

    while (cin >> n >> m)
    {
        memset(res, 0, sizeof(res));
        memset(Map, 0, sizeof(Map));
        node.clear();
        for (int i = 1;i <= n;i++)
            for (int j = 1;j <= m;j++)
            {
                cin >> Map[i][j];
                if (Map[i][j] == ‘Y‘)
                    sx1 = i, sy1 = j;
                if (Map[i][j] == ‘M‘)
                    sx2 = i, sy2 = j;
                if (Map[i][j] == ‘@‘)
                    node.push_back(make_pair(i, j));
            }
         Bfs(sx1, sy1, 0);
         Bfs(sx2, sy2, 1);
         int re = 999999;

         for (int i = 0;i < node.size();i++)
         {
             if (res[node[i].first][node[i].second][0] != 0 && res[node[i].first][node[i].second][1] != 0)
                 re = min(re, res[node[i].first][node[i].second][0] + res[node[i].first][node[i].second][1]);
         }

         cout << re * 11 << endl;
    }

    return 0;
}

  

HDU-2612-Find a way