제출 #391413

#제출 시각아이디문제언어결과실행 시간메모리
391413ml1234Mecho (IOI09_mecho)C++17
5 / 100
75 ms6328 KiB
#include <iostream>
#include <string>
#include <queue>
using namespace std;
bool validmecho(int i, int j);
bool validbees(int i, int j);
bool bfs(int starttime);

string grid[800];
int bees[800][800];
int dx[] = {0, -1, 1, 0}, dy[] = {-1, 0, 0, 1};
int n, s;
pair<int, int> mecho;
int main() 
{
    cin >> n >> s;
    for (int i = 0; i < n; i++)
    {
        cin >> grid[i];
        for (int j = 0; j < n; j++)
        {
            if (grid[i][j] == 'M')
            {
                mecho = {i, j};
            }
        }
    }
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            bees[i][j] = 1e9;
        }
    }
    queue<pair<int, int>> q;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            if (grid[i][j] == 'H')
            {
                q.push({i, j});
                bees[i][j] = 0;
            }
        }
    }
    while (!q.empty())
    {
        int curri = q.front().first, currj = q.front().second;
        q.pop();
        for (int d = 0; d < 4; d++)
        {
            int nexti = curri + dx[d], nextj = currj + dy[d];
            if (validbees(nexti, nextj) && bees[nexti][nextj] > bees[curri][currj] + s)
            {
                bees[nexti][nextj] = bees[curri][currj] + s;
                q.push({nexti, nextj});
            }
        }
    }
    int low = 0, high = n * n;
    while (low < high)
    {
        int mid = (low + high + 1) / 2;
        if (bfs(mid))
        {
            low = mid;
        }
        else
        {
            high = mid - 1;
        }
    }
    cout << low << endl;
    return 0;
}

bool ongrid(int i, int j)
{
    return (i >= 0 && i < n && j >= 0 && j < n);
}
bool validbees(int i, int j)
{
    return (ongrid(i, j) && !(grid[i][j] == 'T') && !(grid[i][j] == 'D') && !(grid[i][j] == 'H'));
}
bool validmecho(int i, int j)
{
    return (ongrid(i, j) && !(grid[i][j] == 'T'));
}

bool bfs(int starttime)
{
    if (starttime * s <= bees[mecho.first][mecho.second])
    {
        return false;
    }
    queue<pair<int, int>> q;
    q.push(mecho);
    vector<vector<int>> mechodist(n, vector<int> (n, -1));
    mechodist[mecho.first][mecho.second] = starttime * s;
    while (!q.empty())
    {
        int curri = q.front().first, currj = q.front().second;
        q.pop();
        if (grid[curri][currj] == 'D')
        {
            return true;
        }
        for (int d = 0; d < 4; d++)
        {
            int nexti = curri + dx[d], nextj = currj + dy[d];
            if (!validmecho(nexti, nextj))
            {
                continue;
            }
            if (mechodist[nexti][nextj] == -1)
            {
                if (bees[nexti][nextj] > mechodist[curri][currj] + 1)
                {
                    mechodist[nexti][nextj] = mechodist[curri][currj] + 1;
                    q.push({nexti, nextj});
                }
            }
        }
    }
    return false;
}
#Verdict Execution timeMemoryGrader output
Fetching results...