import
java.util.Arrays;
import
java.util.Vector;
public
class
PieCutting {
static
long
MOD =
1000000007
;
static
long
[][][] dp;
static
boolean
isValid(Vector<String> pie,
int
startRow,
int
endRow,
int
startCol,
int
endCol) {
for
(
int
i = startRow; i <= endRow; i++) {
for
(
int
j = startCol; j <= endCol; j++) {
if
(pie.get(i).charAt(j) ==
'O'
) {
return
true
;
}
}
}
return
false
;
}
static
int
solver(Vector<String> pie,
int
startRow,
int
startCol,
int
cutsLeft) {
int
m = pie.size(), n = pie.get(
0
).length();
if
(cutsLeft ==
0
)
return
1
;
if
(dp[startRow][startCol][cutsLeft] != -
1
)
return
(
int
) dp[startRow][startCol][cutsLeft];
long
ans =
0
;
for
(
int
row = startRow; row < m -
1
; row++) {
boolean
upperHalfValid = isValid(pie, startRow, row, startCol, n -
1
);
boolean
lowerHalfValid = isValid(pie, row +
1
, m -
1
, startCol, n -
1
);
if
(upperHalfValid && lowerHalfValid) {
int
nextWays = solver(pie, row +
1
, startCol, cutsLeft -
1
);
ans = (ans + nextWays) % MOD;
}
}
for
(
int
col = startCol; col < n -
1
; col++) {
boolean
leftHalfValid = isValid(pie, startRow, m -
1
, startCol, col);
boolean
rightHalfValid = isValid(pie, startRow, m -
1
, col +
1
, n -
1
);
if
(leftHalfValid && rightHalfValid) {
int
nextWays = solver(pie, startRow, col +
1
, cutsLeft -
1
);
ans = (ans + nextWays) % MOD;
}
}
return
(
int
) (dp[startRow][startCol][cutsLeft] = ans);
}
static
int
ways(Vector<String> pie,
int
P) {
int
m = pie.size(), n = pie.get(
0
).length();
if
(P ==
1
)
return
(isValid(pie,
0
, m -
1
,
0
, n -
1
) ?
1
:
0
);
dp =
new
long
[m][n][P];
for
(
int
i =
0
; i < m; i++) {
for
(
int
j =
0
; j < n; j++) {
Arrays.fill(dp[i][j], -
1
);
}
}
int
ans = solver(pie,
0
,
0
, P -
1
);
return
ans;
}
public
static
void
main(String[] args) {
Vector<String> pie =
new
Vector<>();
pie.add(
"O.."
);
pie.add(
"OOO"
);
pie.add(
"..."
);
int
P =
3
;
System.out.println(ways(pie, P));
}
}