第九屆藍橋杯省賽JAVA語言 C組題解_題3 字母陣列
阿新 • • 發佈:2018-12-23
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
```