第九届蓝桥杯省赛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
	```

猜你喜欢

转载自blog.csdn.net/NanyouqiaoMu_/article/details/83959116