Submission #1321106

#TimeUsernameProblemLanguageResultExecution timeMemory
1321106zyntherixMaze (JOI23_ho_t3)C++20
0 / 100
0 ms332 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pi pair<int, int>
#define vi vector<int>
#define vs vector<string>
#define vb vector<bool>
#define vpi vector<pi>
#define pb push_back
#define all(a) (a).begin(), (a).end()
const int mod = 1e9 + 7;
int n, r, c;
vector<vi> grid, dist, vis;

signed main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(NULL);
    cout.tie(NULL);
    cin >> r >> c >> n;
    grid.resize(r, vi(c));
    dist.resize(r, vi(c, mod));
    vis.resize(r, vi(c, 0));
    pi st, fn;
    cin >> st.first >> st.second >> fn.first >> fn.second;
    st.first--;
    st.second--;
    fn.first--;
    fn.second--;
    for (int i = 0; i < r; i++)
    {
        for (int j = 0; j < c; j++)
        {
            char c;
            cin >> c;
            grid[i][j] = (c == '#');
        }
    }
    dist[st.first][st.second] = grid[st.first][st.second];
    vis[st.first][st.second] = 1;
    vpi moves = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
    queue<pi> q;
    q.push(st);
    while (q.size())
    {
        auto p = q.front();
        // cout << p.first << ' ' << p.second << '\n';
        q.pop();
        for (auto mv : moves)
        {
            pi m = make_pair((p.first + mv.first), (p.second + mv.second));
            if (!(m.first >= 0 && m.second >= 0 && m.first < r && m.second < c) || vis[m.first][m.second])
                continue;
            vis[m.first][m.second] = 1;
            q.push(m);
            int mn = mod;
            if (grid[m.first][m.second] == 0)
            {
                if (m.first - 1 >= 0)
                    mn = min(mn, dist[m.first - 1][m.second]);
                if (m.second - 1 >= 0)
                    mn = min(mn, dist[m.first][m.second - 1]);
                if (m.first + 1 < r)
                    mn = min(mn, dist[m.first + 1][m.second]);
                if (m.second - 1 < c)
                    mn = min(mn, dist[m.first][m.second + 1]);
                dist[m.first][m.second] = mn;
                if (m == fn)
                {
                    cout << dist[fn.first][fn.second] << '\n';
                    return 0;
                }
                continue;
            }
            map<pi, int> mp;
            queue<pi> q2;
            q2.push(m);
            mp[m] = 1;
            while (q2.size())
            {
                auto p2 = q2.front();
                q2.pop();
                mn = min(mn, dist[p2.first][p2.second]);
                for (auto mv2 : moves)
                {
                    pi m2 = make_pair((p2.first + mv2.first), (p2.second + mv2.second));
                    if (!(m2.first >= 0 && m2.second >= 0 && m2.first < r && m2.second < c) || mp[m2])
                        continue;
                    mp[m2] = 1;
                    if (abs(m.first - m2.first) <= n && abs(m.second - m2.second) <= n && !(abs(m.first - m2.first) == n && abs(m.second - m2.second) == n))
                        q2.push(m2);
                }
            }
            dist[m.first][m.second] = min(dist[m.first][m.second], mn + 1);
            if (dist[st.first][st.second] && (abs(st.first - m.first) <= n && abs(st.second - m.second) <= n && !(abs(st.first - m.first) == n && abs(st.second - m.second) == n)))
            {
                dist[m.first][m.second] = 1;
            }
            if (m == fn)
            {
                cout << dist[fn.first][fn.second] << '\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...