1. 程式人生 > >第九屆藍橋杯省賽JAVA語言 C組題解_題3 字母陣列

第九屆藍橋杯省賽JAVA語言 C組題解_題3 字母陣列

JAVA語言 C組題解_題3 字母陣列

題目

仔細尋找,會發現:在下面的8x8的方陣中,隱藏著字母序列:“LANQIAO”。
SLANQIAO
ZOEXCCGB
MOAYWKHI
BCCIPLJQ
SLANQIAO
RSFWFNYA
XIFZVWAL
COAIQNAL

我們約定: 序列可以水平,垂直,或者是斜向;
並且走向不限(實際上就是有一共8種方向)。
上圖中一共有4個滿足要求的串。

下面有一個更大的(100x100)的字母方陣。
字元太長這裡就不放了
你能算出其中隱藏了多少個“LANQIAO”嗎?

解題思路

1、 將需要查詢的字串擷取成字元存入陣列。
2、將字母陣列按序存入二維陣列。
3、定義一個move陣列儲存水平,垂直,或者是斜向8個方向相對於上一個位置的位置變化;
4、從一個方向遍歷二維陣列進行與“LANQIAO”陣列對比, 列如先橫向。//程式碼中有詳細註釋
5、通過迴圈進行下一個方向比較。
6、返回運算結果。

//java程式碼
	public static void main(String[] args) {
		// 方法呼叫 三個引數分別為 字母陣列 需要查詢的字元 正方形陣列邊長
		int a = lettersArray("SLANQIAOZOEXCCGBMOAYWKHIBCCIPLJQSLANQIAORSFWFNYAXIFZVWALCOAIQNAL"
, "LANQIAO", 8); // 輸出結果 System.out.println(a); } public static int lettersArray(String str, String LANQIAO, int len) { String[][] s = new String[len][len];// 建立二維陣列儲存字母陣列 String[] lan = new String[LANQIAO.length()];// 建立陣列儲存需要查詢的字串,每位只儲存一個字母 int count = 0;// 結果儲存 for (int i = 0; i < LANQIAO
.length(); i++) {// 將需要查詢的字串擷取成字元存入陣列 lan[i] = LANQIAO.substring(i, i + 1);// .substring(開始位置, 結束位置)方法為擷取字串方法,具體用法百度。 System.out.print(lan[i]); } System.out.println(); int n = 0;// 因為s是二維陣列,單獨定義一個變數作為指標 ,方便擷取 for (int i = 0; i < len; i++) {// 將字串擷取成字元存入二維陣列中 for (int j = 0; j < len; j++) { s[i][j] = str.substring(n, n + 1); n++; System.out.print(s[i][j]);// 檢視二維陣列資料 if (n % len == 0) { System.out.println(); } } } // 定義二維陣列 儲存8個方向,便於迴圈比較 列如:s[p][q] 和 s[p][q+1], q+1就相當於向右移動一位 int[][] move = { { 0, 1 }, { 1, 1 }, { 1, 0 }, { 1, -1 }, { 0, -1 }, { -1, -1 }, { -1, 0 }, { -1, 1 }, }; for (int m = 0; m < 8; m++) {// 八個方向進行比較判斷 for (int i = 0; i < len; i++) {// 雙層迴圈遍歷二維陣列 for (int j = 0; j < len; j++) { int p = i;//額外定義兩個邊量儲存 i和j的值 int q = j;//避免因為值變化導致死迴圈 // 如果s[i][j]與lan[num]]的值相同則進入下一次迴圈 num+1 陣列lan儲存的值為L A N Q I A O for (int num = 0; p < len && p >= 0 && q < len && q >= 0 && num < lan.length && s[p][q].equals(lan[num]); num++) { //相等後進行位置變換比較下一個字母是否相等 p = p + move[m][0]; q = q +move[m][1]; //如果num==6則表示前面字元都相等。故count+1。 if (num == lan.length - 1) { System.out.println(true); count++; } } } } } return count;//返回運算結果 } } return count; } //列印臺結果 // LANQIAO // SLANQIAO // ZOEXCCGB // MOAYWKHI // BCCIPLJQ // SLANQIAO // RSFWFNYA // XIFZVWAL // COAIQNAL // true // true // true // true // 4 ```