Submission #1325015

#TimeUsernameProblemLanguageResultExecution timeMemory
1325015vicvicMaze (JOI23_ho_t3)C++20
100 / 100
612 ms352072 KiB
#include <bits/stdc++.h>

using namespace std;
const int dx[]={0, 0, -1, 1, -1, 1, -1, 1}, dy[]={-1, 1, 0, 0, -1, 1, 1, -1};
int n, r, c, sx, sy, ex, ey;
int main ()
{
    ios_base :: sync_with_stdio (0);
    cin.tie (nullptr);
    cin >> r >> c >> n >> sx >> sy >> ex >> ey;
    sx--, sy--, ex--, ey--;
    vector <string> mat (r);
    for (auto &chestie : mat)
        cin >> chestie;
    vector <vector <int>> viz (r, vector <int> (c, 0));
    queue <pair <int, int>> nxt;
    vector <pair <int, int>> neigh;
    auto isMat = [&] (pair <int, int> a)
    {
        return a.first>=0 && a.first<r && a.second>=0 && a.second<c;
    };
    auto dfs = [&] (pair <int, int> crt)
    {
        if (viz[crt.first][crt.second])
            return;
        if (mat[crt.first][crt.second]=='#')
        {
            neigh.push_back (crt);
            return;
        }
        viz[crt.first][crt.second]=1;
        for (int d=0;d<4;d++)
        {
            auto ptr=crt;
            ptr.first+=dx[d];
            ptr.second+=dy[d];
            if (isMat (ptr))
                nxt.push (ptr);
        }
    };
    auto sim = [&] (pair <int, int> crt)
    {
        if (viz[crt.first][crt.second])
            return;
        viz[crt.first][crt.second]=1;
        for (int d=0;d<8;d++)
        {
            auto ptr=crt;
            ptr.first+=dx[d];
            ptr.second+=dy[d];
            if (isMat (ptr))
            {
                if (d<4)
                    nxt.push (ptr);
                neigh.push_back (ptr);
            }
        }
    };
    dfs ({sx, sy});
    int ret=0;
    while (true)
    {
        while (!nxt.empty())
            dfs (nxt.front()), nxt.pop ();
        if (viz[ex][ey])
            break;
        ret++;
        for (int i=1;i<=n;i++)
        {
            auto rt=neigh;
            neigh.clear ();
            for (auto chestie : rt)
                sim (chestie);
        }
        neigh.clear ();
    }
    cout << ret << "\n";
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...