import
java.util.*;
class
Solution {
int
[][] mover = {{
1
,
0
}, {
0
,
1
}, {-
1
,
0
}, {
0
, -
1
}};
char
[][] board;
public
boolean
dfs(
int
x,
int
y, String s,
boolean
[][] vis) {
if
(s.length() ==
0
) {
return
true
;
}
vis[x][y] =
true
;
boolean
sol =
false
;
for
(
int
i =
0
; i < mover.length; i++) {
int
curr_x = mover[i][
0
] + x;
int
curr_y = mover[i][
1
] + y;
if
(curr_x >=
0
&& curr_x < board.length) {
if
(curr_y >=
0
&& curr_y < board[
0
].length) {
if
(board[curr_x][curr_y] == s.charAt(
0
) && !vis[curr_x][curr_y]) {
String k = s.substring(
1
);
sol |= dfs(curr_x, curr_y, k, vis);
}
}
}
}
return
sol;
}
public
List<String> findWords(
char
[][] board, String[] words) {
this
.board = board;
List<String> ans =
new
ArrayList<>();
for
(String word : words) {
boolean
[][] vis =
new
boolean
[board.length][board[
0
].length];
for
(
int
i =
0
; i < board.length; i++) {
for
(
int
j =
0
; j < board[i].length; j++) {
if
(board[i][j] == word.charAt(
0
)) {
String s = word.substring(
1
);
if
(dfs(i, j, s, vis)) {
ans.add(word);
break
;
}
}
}
if
(!ans.isEmpty() && ans.get(ans.size() -
1
).equals(word)) {
break
;
}
}
}
return
ans;
}
}
class
Main {
public
static
void
main(String[] args) {
Solution solver =
new
Solution();
char
[][] board = { {
'o'
,
'a'
,
'a'
,
'n'
}, {
'e'
,
't'
,
'a'
,
'e'
}, {
'i'
,
'h'
,
'k'
,
'r'
}, {
'i'
,
'f'
,
'l'
,
'v'
} };
String[] words = {
"oath"
,
"pea"
,
"eat"
,
"rain"
};
System.out.println(
"Words present: "
);
List<String> arr = solver.findWords(board, words);
for
(
int
i =
0
; i < arr.size(); i++) {
System.out.println(arr.get(i));
}
}
}