class
Solution
{
static
final
int
r=
4
,c=
5
;
static
int
findMinSteps(
int
mat[][],
int
n,
int
m,
int
dp[][],
boolean
vis[][])
{
if
(n ==
0
|| m ==
0
|| n == (r -
1
) || m == (c -
1
)) {
return
0
;
}
if
(dp[n][m] != -
1
)
return
dp[n][m];
vis[n][m] =
true
;
int
ans1, ans2, ans3, ans4;
ans1 = ans2 = ans3 = ans4 = (
int
)1e9;
if
(mat[n -
1
][m] ==
0
) {
if
(!vis[n -
1
][m])
ans1 =
1
+ findMinSteps(mat, n -
1
, m, dp, vis);
}
if
(mat[n][m +
1
] ==
0
) {
if
(!vis[n][m +
1
])
ans2 =
1
+ findMinSteps(mat, n, m +
1
, dp, vis);
}
if
(mat[n][m -
1
] ==
0
) {
if
(!vis[n][m -
1
])
ans3 =
1
+ findMinSteps(mat, n, m -
1
, dp, vis);
}
if
(mat[n +
1
][m] ==
0
) {
if
(!vis[n +
1
][m])
ans4 =
1
+ findMinSteps(mat, n +
1
, m, dp, vis);
}
dp[n][m] = Math.min(ans1, Math.min(ans2, Math.min(ans3, ans4)));
return
dp[n][m];
}
static
int
minimumSteps(
int
mat[][],
int
n,
int
m)
{
int
twox = -
1
;
int
twoy = -
1
;
for
(
int
i =
0
; i < n; i++) {
for
(
int
j =
0
; j < m; j++) {
if
(mat[i][j] ==
2
) {
twox = i;
twoy = j;
break
;
}
}
if
(twox != -
1
)
break
;
}
int
dp[][]=
new
int
[r][r];
for
(
int
j=
0
;j<r;j++)
for
(
int
i=
0
;i<r;i++)dp[j][i]=-
1
;
boolean
vis[][]=
new
boolean
[r][r];
for
(
int
j=
0
;j<r;j++)
for
(
int
i=
0
;i<r;i++)vis[j][i]=
false
;
int
res = findMinSteps(mat, twox, twoy, dp, vis);
if
(res >= 1e9)
return
-
1
;
else
return
res;
}
public
static
void
main(String args[])
{
int
mat[][] = { {
1
,
1
,
1
,
0
,
1
},
{
1
,
0
,
2
,
0
,
1
},
{
0
,
0
,
1
,
0
,
1
},
{
1
,
0
,
1
,
1
,
0
} };
System.out.println( minimumSteps(mat, r, c));
}
}