仔细寻找,会发现:在下面的8x8的方阵中,隐藏着字母序列:"LANQIAO"。
SLANQIAO
ZOEXCCGB
MOAYWKHI
BCCIPLJQ
SLANQIAO
RSFWFNYA
XIFZVWAL
COAIQNAL
我们约定: 序列可以水平,垂直,或者是斜向;
并且走向不限(实际上就是有一共8种方向)。
上图中一共有4个满足要求的串。
下面有一个更大的(100x100)的字母方阵。
你能算出其中隐藏了多少个“LANQIAO”吗?
题目太长我就不上了,测试数据可以用这个短的
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
char str[][] = new char[n][n];
for (int i = 0; i < n; i++)
// 将输入的字符串转化为字节数组
str[i] = scanner.next().toCharArray();
String eq = "LANQIAO";
int i, j, k, tx, ty, l, flag;
int count = 0;// 计数器
// 8个移动方向。右、右下、下、左下、左、左上、上、右上
int move[][] = { { 0, 1 }, { 1, 1 }, { 1, 0 }, { 1, -1 }, { 0, -1 }, { -1, -1 }, { -1, 0 }, { -1, 1 } };
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
// 当如果遍历到字符L,则就通过当前位置向8个方向进行拓展。各个方向都拓展6个字节长度
if (str[i][j] == 'L') {
//对8个方向的位置都进行拓展
for (k = 0; k <= 7; k++) {
String eq2 = "L";
tx = i;
ty = j;
flag = 0;
// 各个方向都拓展6个字节长度
for (l = 1; l <= 6; l++) {
tx += move[k][0];//移动:x轴
ty += move[k][1];//移动:y轴
// 判断有没有越界
if (tx < 0 || ty < 0 || tx >= n || ty >= n)
continue;
// LANQIAO
// 优化算法的时间复杂度:判断L的下一个字符串如果不是A,那么就直接跳出,没有必要再在这个方向继续向下一步进行拓展
if (str[tx][ty] != 'A' && flag == 0)
break;
//LANQIAO
flag=1;//通过第一次判断为A,则下轮就就不用再次进行判断
eq2 += str[tx][ty] + "";
}
if (eq.equals(eq2)) {
count++;
}
}
}
}
}
System.out.println(count);
}