← Каталог
C++ — олимпиадные шаблоны — BFS на сетке (лабиринт)
Фрагмент из «C++ — олимпиадные шаблоны»: BFS на сетке (лабиринт).
const int dr[4] = {1, -1, 0, 0};
const int dc[4] = {0, 0, 1, -1};
int bfs_grid(int sr, int sc, int tr, int tc,
const vector<string> &grid) {
int n = grid.size m = grid[0].size();
vector<vector<int>> dist(n, vector<int>(m, -1));
queue<pair<int, int>> q;
dist[sr][sc] = 0;
q.push({sr, sc});
while (!q.empty()) {
auto [r, c] = q.front();
q.pop();
if (r == tr && c == tc) {
return dist[r][c];
}
for (int k = 0; k < 4; ++k) {
int nr = r + dr[k], nc = c + dc[k];
if (nr < 0 || nr >= n || nc < 0 || nc >= m) continue;
if (grid[nr][nc] == '#') continue;
if (dist[nr][nc] != -1) continue;
dist[nr][nc] = dist[r][c] + 1;
q.push({nr, nc});
}
}
return -1;
} const int dr[4] = {1, -1, 0, 0};
const int dc[4] = {0, 0, 1, -1};
int bfs_grid(int sr, int sc, int tr, int tc,
const vector<string> &grid) {
int n = grid.size m = grid[0].size();
vector<vector<int>> dist(n, vector<int>(m, -1));
queue<pair<int, int>> q;
dist[sr][sc] = 0;
q.push({sr, sc});
while (!q.empty()) {
auto [r, c] = q.front();
q.pop();
if (r == tr && c == tc) {
return dist[r][c];
}
for (int k = 0; k < 4; ++k) {
int nr = r + dr[k], nc = c + dc[k];
if (nr < 0 || nr >= n || nc < 0 || nc >= m) continue;
if (grid[nr][nc] == '#') continue;
if (dist[nr][nc] != -1) continue;
dist[nr][nc] = dist[r][c] + 1;
q.push({nr, nc});
}
}
return -1;
}