import
java.util.*;
class
Main {
static
int
ways =
0
;
public
static
void
printMatrix(List<String> matrix,
int
n) {
for
(
int
i =
0
; i < n; i++) {
System.out.println(matrix.get(i));
}
}
public
static
List<String> checkHorizontal(
int
x,
int
y, List<String> matrix, String currentWord) {
int
n = currentWord.length();
for
(
int
i =
0
; i < n; i++) {
if
(matrix.get(x).charAt(y + i) ==
'#'
|| matrix.get(x).charAt(y + i) == currentWord.charAt(i)) {
StringBuilder sb =
new
StringBuilder(matrix.get(x));
sb.setCharAt(y + i, currentWord.charAt(i));
matrix.set(x, sb.toString());
}
else
{
matrix.set(
0
,
"@"
);
return
matrix;
}
}
return
matrix;
}
public
static
List<String> checkVertical(
int
x,
int
y, List<String> matrix, String currentWord) {
int
n = currentWord.length();
for
(
int
i =
0
; i < n; i++) {
if
(matrix.get(x + i).charAt(y) ==
'#'
|| matrix.get(x + i).charAt(y) == currentWord.charAt(i)) {
StringBuilder sb =
new
StringBuilder(matrix.get(x + i));
sb.setCharAt(y, currentWord.charAt(i));
matrix.set(x + i, sb.toString());
}
else
{
matrix.set(
0
,
"@"
);
return
matrix;
}
}
return
matrix;
}
public
static
void
solvePuzzle(List<String> words, List<String> matrix,
int
index,
int
n) {
if
(index < words.size()) {
String currentWord = words.get(index);
int
maxLen = n - currentWord.length();
for
(
int
i =
0
; i < n; i++) {
for
(
int
j =
0
; j <= maxLen; j++) {
List<String> temp =
new
ArrayList<>(checkVertical(j, i,
new
ArrayList<>(matrix), currentWord));
if
(!temp.get(
0
).equals(
"@"
)) {
solvePuzzle(words, temp, index +
1
, n);
}
}
}
for
(
int
i =
0
; i < n; i++) {
for
(
int
j =
0
; j <= maxLen; j++) {
List<String> temp =
new
ArrayList<>(checkHorizontal(i, j,
new
ArrayList<>(matrix), currentWord));
if
(!temp.get(
0
).equals(
"@"
)) {
solvePuzzle(words, temp, index +
1
, n);
}
}
}
}
else
{
System.out.println((ways +
1
) +
" way to solve the puzzle "
);
printMatrix(matrix, n);
System.out.println();
ways++;
return
;
}
}
public
static
void
main(String[] args) {
int
n1 =
10
;
List<String> matrix =
new
ArrayList<>();
matrix.add(
"*#********"
);
matrix.add(
"*#********"
);
matrix.add(
"*#****#***"
);
matrix.add(
"*##***##**"
);
matrix.add(
"*#****#***"
);
matrix.add(
"*#****#***"
);
matrix.add(
"*#****#***"
);
matrix.add(
"*#*######*"
);
matrix.add(
"*#********"
);
matrix.add(
"***#######"
);
List<String> words =
new
ArrayList<>();
words.add(
"PUNJAB"
);
words.add(
"JHARKHAND"
);
words.add(
"MIZORAM"
);
words.add(
"MUMBAI"
);
ways =
0
;
solvePuzzle(words, matrix,
0
, n1);
System.out.println(
"Number of ways to fill the grid is "
+ ways);
}
}