2019網易遊戲(互娛)遊戲研發編程題--字符迷陣

字符迷陣是一種經典的智力遊戲。玩家需要在給定的矩形的字符迷陣中尋找特定的單詞。

在這題的規則中,單詞是如下規定的:

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);
		}

	}

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章