Problem
给定一个由字符和单词组成的m x n 2D棋盘,找出该单词在棋盘中出现的次数.
单词可以由连续相邻单元的字母构成,其中相邻单元水平或垂直相邻.
注意:同一个字母单元格不能使用多次.
输入格式
第一行包含两个空格分隔的整数m,n,分别表示电路板中的行数和列数.
约束条件
1<;=1m、 n<;=n5
1<;=长度(单词)<;=30
enter code here
输出格式
在二维板上打印给定单词的总数.
Sample Input
3 4
HDST
ANEO
BENY
NEST // word
Sample Output
2
我也不能满足测试用例
5 5
LACOO
OOOCL
NLOOO
ECOCO
MECOO
COOLOOC
Output should be
28
My Code
public static void main(String[] args) {
int m, n;
Scanner sc = new Scanner(System.in);
m = sc.nextInt();
n = sc.nextInt();
char[][] board = new char[m][n + 1];
for (int i = 0; i < m; i++) {
String temp = sc.next();
board[i] = temp.toCharArray();
}
String word = sc.next();
System.out.print(new Result().countWord(board, word, m, n));
}
static class Result {
static boolean[][] visited;
static int count = 0;
int countWord(char board[][], String word, int m, int n) {
visited = new boolean[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (board[i][j] == word.charAt(0)) {
if(searchWord(board, word, i, j, m, n, 0))
count++;
}
}
}
return count;
}
static boolean searchWord(char board[][], String word, int i, int j, int m, int n, int index) {
if (index == word.length()) {
count++;
return true;
}
if (i < 0 || j < 0 || i >= m || j >= n)
return false;
if (visited[i][j] || board[i][j] != word.charAt(index))
return false;
visited[i][j] = true;
if (searchWord(board, word, i - 1, j, m, n, index + 1) ||
searchWord(board, word, i + 1, j, m, n, index + 1) ||
searchWord(board, word, i, j - 1, m, n, index + 1) ||
searchWord(board, word, i, j + 1, m, n, index + 1)) {
return true;
}
visited[i][j] = false;
return false;
}
}