import
java.util.*;
class
GFG
{
static
void
dfs(
int
u, Vector<Integer> g[],
int
prt[],
boolean
visit[])
{
visit[u] =
true
;
for
(
int
i =
0
; i < g[u].size(); i++)
{
int
v = g[u].get(i);
if
(!visit[v])
{
prt[v] = u;
dfs(v, g, prt, visit);
}
}
}
static
int
turnsToReachDestination(String grid[],
int
M)
{
int
N = grid[
0
].length();
int
dx[] = {-
1
,
0
,
1
,
0
};
int
dy[] = {
0
, -
1
,
0
,
1
};
Vector<Integer> []g =
new
Vector[M*N];
for
(
int
i =
0
; i < M*N; i++)
g[i] =
new
Vector<Integer>();
boolean
[]visit =
new
boolean
[M*N];
int
[]prt =
new
int
[M*N];
int
start = -
1
, dest = -
1
;
for
(
int
i =
0
; i < M; i++)
{
for
(
int
j =
0
; j < N; j++)
{
if
(grid[i].charAt(j) ==
'D'
)
dest = i * N + j;
if
(grid[i].charAt(j) ==
'S'
)
start = i * N + j;
g[i * N + j].clear();
if
(grid[i].charAt(j) !=
'B'
)
{
for
(
int
k =
0
; k <
4
; k++)
{
int
u = i + dx[k];
int
v = j + dy[k];
if
(u >=
0
&& u < M && v >=
0
&&
v < N && grid[u].charAt(v) !=
'B'
)
g[i * N + j].add(u * N + v);
}
}
}
}
dfs(start, g, prt, visit);
int
curr = dest;
int
res =
0
;
while
(curr != start)
{
if
(g[curr].size() >
2
)
res++;
curr = prt[curr];
}
return
res;
}
public
static
void
main(String[] args)
{
String grid[] =
{
".BBB.B.BB"
,
".....B.B."
,
"B.B.B.BSB"
,
".DB......"
};
int
M = grid.length;
System.out.print(turnsToReachDestination(grid, M) +
"\n"
);
}
}