제출 #391391

#제출 시각아이디문제언어결과실행 시간메모리
391391ml1234Mecho (IOI09_mecho)C++17
27 / 100
1102 ms8644 KiB
#include <iostream>
#include <string>
#include <queue>
using namespace std;
void floodfillbees(int i, int j);
bool validmecho(int i, int j);

string grid[800];
int bees[800][800];
int dx[] = {0, -1, 1, 0}, dy[] = {-1, 0, 0, 1};
int n, s;
int main() 
{
    cin >> n >> s;
    pair<int, int> mecho = {0, 0};
    int mechodist[800][800], mindiff[800][800]{};
    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;
            mechodist[i][j] = -1;
        }
    }
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            if (grid[i][j] == 'H')
            {
                floodfillbees(i, j);
            }
        }
    }
    queue<pair<int, int>> q;
    q.push(mecho);
    mechodist[mecho.first][mecho.second] = 0;
    mindiff[mecho.first][mecho.second] = bees[mecho.first][mecho.second];
    int ans = 0;
    while (!q.empty())
    {
        int curri = q.front().first, currj = q.front().second;
        q.pop();
        if (grid[curri][currj] == 'D')
        {
            if (mindiff[curri][currj] > 0)
            {
                ans = max(ans, mindiff[curri][currj] / s);
            }
            continue;
        }
        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)
            {
                mechodist[nexti][nextj] = mechodist[curri][currj] + 1;
                mindiff[nexti][nextj] = min(mindiff[curri][currj], bees[nexti][nextj] - mechodist[nexti][nextj]);
                q.push({nexti, nextj});
            }
        }
    }
    cout << ans << 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'));
}

void floodfillbees(int i, int j)
{
    queue<pair<int, int>> q;
    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});
            }
        }
    }
}

#Verdict Execution timeMemoryGrader output
Fetching results...