using
System;
using
System.Collections.Generic;
class
GFG {
static
int
MAX = 5;
static
int
N = 5;
static
int
M = 5;
static
int
inf = 100000;
public
static
int
cost(
char
[,] grid,
int
row1,
int
col1,
int
row2,
int
col2)
{
if
(row1 == row2 && col1 == col2) {
if
(grid[row1, col1] ==
'*'
)
return
1;
return
0;
}
int
ans = 0;
if
(grid[row1, col1] ==
'*'
)
ans++;
if
(grid[row2, col2] ==
'*'
)
ans++;
return
ans;
}
public
static
int
solve(
int
n,
int
m,
char
[,] grid,
int
[,,] dp,
int
row1,
int
col1,
int
row2)
{
int
col2 = (row1 + col1) - (row2);
if
(row1 == n - 1 && col1 == m - 1 && row2 == n - 1
&& col2 == m - 1)
return
0;
if
(row1 >= n || col1 >= m || row2 >= n
|| col2 >= m)
return
-1 * inf;
if
(dp[row1, col1, row2] != -1)
return
dp[row1, col1, row2];
int
ch1 = -1 * inf, ch2 = -1 * inf;
int
ch3 = -1 * inf, ch4 = -1 * inf;
if
(col1 + 1 < m && row2 + 1 < n
&& grid[row1, col1 + 1] !=
'#'
&& grid[row2 + 1, col2] !=
'#'
)
ch1 = cost(grid, row1, col1 + 1, row2 + 1, col2)
+ solve(n, m, grid, dp, row1, col1 + 1,
row2 + 1);
if
(col2 + 1 < m && col1 + 1 < m
&& grid[row1, col1 + 1] !=
'#'
&& grid[row2, col2 + 1] !=
'#'
)
ch2 = cost(grid, row1, col1 + 1, row2, col2 + 1)
+ solve(n, m, grid, dp, row1, col1 + 1,
row2);
if
(col2 + 1 < m && row1 + 1 < n
&& grid[row1 + 1, col1] !=
'#'
&& grid[row2, col2 + 1] !=
'#'
)
ch3 = cost(grid, row1 + 1, col1, row2, col2 + 1)
+ solve(n, m, grid, dp, row1 + 1, col1,
row2);
if
(row1 + 1 < n && row2 + 1 < n
&& grid[row1 + 1, col1] !=
'#'
&& grid[row2 + 1, col2] !=
'#'
)
ch4 = cost(grid, row1 + 1, col1, row2 + 1, col2)
+ solve(n, m, grid, dp, row1 + 1, col1,
row2 + 1);
return
dp[row1, col1, row2] = Math.Max(
ch1, Math.Max(ch2, Math.Max(ch3, ch4)));
}
public
static
int
wrapper(
int
n,
int
m,
char
[,] grid)
{
int
ans = 0;
int
[,,] dp =
new
int
[MAX, MAX, MAX];
for
(
int
i = 0; i < MAX; i++)
for
(
int
j = 0; j < MAX; j++)
for
(
int
k = 0; k < MAX; k++)
dp[i, j, k] = -1;
if
(grid[n - 1, m - 1] ==
'#'
|| grid[0, 0] ==
'#'
)
ans = -1 * inf;
if
(grid[0, 0] ==
'*'
)
ans++;
grid[0, 0] =
'.'
;
if
(grid[n - 1, m - 1] ==
'*'
)
ans++;
grid[n - 1, m - 1] =
'.'
;
ans += solve(n, m, grid, dp, 0, 0, 0);
return
Math.Max(ans, 0);
}
public
static
void
Main(
string
[] args)
{
int
n = 5, m = 5;
char
[,] grid = { {
'.'
,
'*'
,
'.'
,
'*'
,
'.'
},
{
'*'
,
'#'
,
'#'
,
'#'
,
'.'
},
{
'*'
,
'.'
,
'*'
,
'.'
,
'*'
},
{
'.'
,
'#'
,
'#'
,
'#'
,
'*'
},
{
'.'
,
'*'
,
'.'
,
'*'
,
'.'
} };
Console.WriteLine(wrapper(n, m, grid));
}
}