#include #include #include using namespace std; int n, m; char mat[101][101]; int bfs(pair S, pair E) { int si = S.first, sj = S.second; int ei = E.first, ej = E.second; queue q; q.push(si); q.push(sj); q.push(0); vector> visited(n, vector(m, false)); visited[si][sj] = true; while(!q.empty()) { int ci = q.front(); q.pop(); int cj = q.front(); q.pop(); int dist = q.front(); q.pop(); if(ci == ei and cj == ej) { return dist; } if(ci + 1 < n and mat[ci + 1][cj] != '#' and !visited[ci + 1][cj]) { q.push(ci + 1); q.push(cj); q.push(dist + 1); visited[ci + 1][cj] = true; } if(ci - 1 >= 0 and mat[ci - 1][cj] != '#' and !visited[ci - 1][cj]) { q.push(ci - 1); q.push(cj); q.push(dist + 1); visited[ci - 1][cj] = true; } if(cj + 1 < m and mat[ci][cj + 1] != '#' and !visited[ci][cj + 1]) { q.push(ci); q.push(cj + 1); q.push(dist + 1); visited[ci][cj + 1] = true; } if(cj - 1 >= 0 and mat[ci][cj - 1] != '#' and !visited[ci][cj - 1]) { q.push(ci); q.push(cj - 1); q.push(dist + 1); visited[ci][cj - 1] = true; } } return 1e8; } int main() { cin >> n >> m; pair S, E; vector> drinks; for(int i = 0; i < n; i++) { for(int j = 0; j < m; j++) { cin >> mat[i][j]; if(mat[i][j] == 'S') { S = make_pair(i, j); } if(mat[i][j] == 'B') { E = make_pair(i, j); } if(mat[i][j] == 'D') { drinks.push_back(make_pair(i, j)); } } } int res = 2e9; if(drinks.size() == 1) { res = bfs(S, drinks[0]) + bfs(drinks[0], E); } else if(drinks.size() == 2) { res = bfs(S, drinks[0]) + bfs(drinks[0], drinks[1]) + bfs(drinks[1], E); res = min(res, bfs(S, drinks[1]) + bfs(drinks[1], drinks[0]) + bfs(drinks[0], E)); } else { res = bfs(S, drinks[0]) + bfs(drinks[0], drinks[1]) + bfs(drinks[1], drinks[2]) + bfs(drinks[2], E); res = min(res, bfs(S, drinks[0]) + bfs(drinks[0], drinks[2]) + bfs(drinks[2], drinks[1]) + bfs(drinks[1], E)); res = min(res, bfs(S, drinks[1]) + bfs(drinks[1], drinks[0]) + bfs(drinks[0], drinks[2]) + bfs(drinks[2], E)); res = min(res, bfs(S, drinks[1]) + bfs(drinks[1], drinks[2]) + bfs(drinks[2], drinks[0]) + bfs(drinks[0], E)); res = min(res, bfs(S, drinks[2]) + bfs(drinks[2], drinks[0]) + bfs(drinks[0], drinks[1]) + bfs(drinks[1], E)); res = min(res, bfs(S, drinks[2]) + bfs(drinks[2], drinks[1]) + bfs(drinks[1], drinks[0]) + bfs(drinks[0], E)); } if(res > 1e8) { res = -1; } cout << res << endl; return 0; }