第九届蓝桥杯省赛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;//返回运算结果 } //打印台结果 // LANQIAO // SLANQIAO // ZOEXCCGB // MOAYWKHI // BCCIPLJQ // SLANQIAO // RSFWFNYA // XIFZVWAL // COAIQNAL // true // true // true // true // 4 ```