字符迷陣是一種經典的智力遊戲。玩家需要在給定的矩形的字符迷陣中尋找特定的單詞。
在這題的規則中,單詞是如下規定的:
1. 在字符迷陣中選取一個字符作爲單詞的開頭;
2. 選取右方、下方、或右下45度方向作爲單詞的延伸方向;
3. 以開頭的字符,以選定的延伸方向,把連續得到的若干字符拼接在一起,則稱爲一個單詞。
以圖1爲例,如果要在其中尋找單詞"WORD",則綠色框所標示的都是合法的方案,而紅色框所標示的都是不合法的方案。
現在的問題是,給出一個字符迷陣,及一個要尋找的單詞,問能在字符迷陣中找到多少個該單詞的合法方案。注意合法方案是可以重疊的,如圖1所示的字符迷陣,其中單詞"WORD"的合法方案有4種。
輸入描述:
輸入的第一行爲一個正整數T,表示測試數據組數。 接下來有T組數據。每組數據的第一行包括兩個整數m和n,表示字符迷陣的行數和列數。接下來有m行,每一行爲一個長度爲n的字符串,按順序表示每一行之中的字符。再接下來還有一行包括一個字符串,表示要尋找的單詞。 數據範圍: 對於所有數據,都滿足1<=T<=9,且輸入的所有位於字符迷陣和單詞中的字符都爲大寫字母。要尋找的單詞最短爲2個字符,最長爲9個字符。字符迷陣和行列數,最小爲1,最多爲99。 對於其中50%的數據文件,字符迷陣的行列數更限制爲最多爲20。
輸出描述:
對於每一組數據,輸出一行,包含一個整數,爲在給定的字符迷陣中找到給定的單詞的合法方案數。
示例1
輸入
3
10 10
AAAAAADROW
WORDBBBBBB
OCCCWCCCCC
RFFFFOFFFF
DHHHHHRHHH
ZWZVVVVDID
ZOZVXXDKIR
ZRZVXRXKIO
ZDZVOXXKIW
ZZZWXXXKIK
WORD
3 3
AAA
AAA
AAA
AA
5 8
WORDSWOR
ORDSWORD
RDSWORDS
DSWORDSW
SWORDSWO
SWORD
輸出
4
16
5
分析:這是一道的固定方向的深度搜索
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int t = input.nextInt();
while (t > 0) {
int n = input.nextInt();
int m = input.nextInt();
char[][] arr = new char[100][100];//字符迷陣
char[] word = new char[100];//字符串
for (int i = 0; i < n; i++) {
arr[i] = input.next().toCharArray();//字符迷陣輸入
}
word = input.next().toCharArray();//字符串輸入
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
for (int k = 0; k <= 2; k++) {
dfs(arr, word, i, j, 0, k);
}
}
}
t--;
System.out.println(count);
count = 0;
}
}
private static int count = 0;
private static void dfs(char[][] arr, char[] word, int row, int col, int wordpos, int dir) {
// TODO Auto-generated method stub
if (wordpos == word.length) {
count++;
return;
}
if (row == arr.length || col == arr[0].length) {
return;
}
if (arr[row][col] != word[wordpos]) {
return;
}
if (dir == 0) { // 向右
dfs(arr, word, row, col + 1, wordpos + 1, dir);
} else if (dir == 1) { // 向下
dfs(arr, word, row + 1, col, wordpos + 1, dir);
} else if (dir == 2) { // 向右下
dfs(arr, word, row + 1, col + 1, wordpos + 1, dir);
}
}
}