题目
仔细寻找,会发现:在下面的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
```