ホーム > libalgo

グリッド上の幅優先探索

概要

グリッド上の幅優先探索.

計算量

$O(HW)$

使い方

grid_bfs(grid, start, wall)
grid を文字 start を始点に wall は通らないで幅優先探索する.距離の 2 次元 vector を返す

実装

std::vector<std::vector<int>> grid_bfs(const std::vector<std::string> &g, char start, char wall) {
    const int INF = 1000000000;
    using pii = std::pair<int, int>;

    int h = g.size(), w = g[0].size();
    static const auto is_valid = [&](int i, int j) {
        if (i < 0 || i >= h || j < 0 || j >= w) return false;
        if (g[i][j] == wall) return false;
        return true;
    };

    static const pii dir[] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
    std::queue<pii> q;
    std::vector<std::vector<int>> d(h, std::vector<int>(w, INF));

    rep(i, h) rep(j, w) {
        if (g[i][j] == start) {
            d[i][j] = 0;
            q.emplace(i, j);
        }
    }

    while (q.size()) {
        int ci, cj;
        std::tie(ci, cj) = q.front();
        q.pop();
        for (auto &v : dir) {
            int ni = ci + v.first;
            int nj = cj + v.second;
            if (is_valid(ni, nj)) {
                int nd = d[ci][cj] + 1;
                if (d[ni][nj] > nd) {
                    d[ni][nj] = nd;
                    q.emplace(ni, nj);
                }
            }
        }
    }

    return d;
}