字母阵列
仔细寻找,会发现:在下面的8x8的方阵中,隐藏着字母序列:“LANQIAO”。
SLANQIAO
ZOEXCCGB
MOAYWKHI
BCCIPLJQ
SLANQIAO
RSFWFNYA
XIFZVWAL
COAIQNAL
我们约定: 序列可以水平,垂直,或者是斜向;
并且走向不限(实际上就是有一共8种方向)。
上图中一共有4个满足要求的串。
下面有一个更大的(100x100)的字母方阵。(file.txt 文件太大,这里我就不发了)
你能算出其中隐藏了多少个“LANQIAO”吗?
分析:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
char[][]arr = new char[100][100];
int i=0;
File file = new File("file.txt");//读取文件,注意格式
//使用IO流读取
BufferedReader br = new BufferedReader(new FileReader(file));
String s = br.readLine();//一次读取一行,如果读取不到,返回null
while(s!=null){
arr[i] = s.toCharArray();
i++;
s = br.readLine();
}
int n = 0;//记录总个数
String c = "";//声明用于判断的字符串,初始为空
for (int j = 0; j < 100; j++) {
for (int j2 = 0; j2 < 100; j2++) {//循环二维数组
if(j2<100-6){//从左向右,如果下标满足了则可以去判断是否是“LANQIAO”
for (int k = 0; k <=6; k++) {
c=c+""+arr[j][j2+k];//根据规律拼接每一个字符
}
if(c.equals("LANQIAO")){//判断拼接的字符串是否是“LANQIAO”
n++;//次数增加
}
c = "";//重置字符串
}
if(j2>=6){//从右到左
for (int k = 0; k <=6; k++) {
c=c+""+arr[j][j2-k];
}
if(c.equals("LANQIAO")){
n++;
}
c = "";
}
if(j<100-6){//从上到下
for (int k = 0; k <=6; k++) {
c=c+""+arr[j+k][j2];
}
if(c.equals("LANQIAO")){
n++;
}
c = "";
}
if(j>=6){//从下到上
for (int k = 0; k <=6; k++) {
c=c+""+arr[j-k][j2];
}
if(c.equals("LANQIAO")){
n++;
}
c = "";
}
if(j<100-6 && j2>=6){//从左下到右上
for (int k = 0; k <=6; k++) {
c=c+""+arr[j+k][j2-k];
}
if(c.equals("LANQIAO")){
n++;
}
c = "";
}
if(j>=6 && j2<100-6){//从右上到左下
for (int k = 0; k <=6; k++) {
c=c+""+arr[j-k][j2+k];
}
if(c.equals("LANQIAO")){
n++;
}
c = "";
}
if(j>=6 && j2>=6){//从右下到左上
for (int k = 0; k <=6; k++) {
c=c+""+arr[j-k][j2-k];
}
if(c.equals("LANQIAO")){
n++;
}
c = "";
}
if(j<100-6 && j2<100-6){//从左上到右下
for (int k = 0; k <=6; k++) {
c=c+""+arr[j+k][j2+k];
}
if(c.equals("LANQIAO")){
n++;
}
c = "";
}
}
}
System.out.println("其中隐藏了个"+n+"“LANQIAO”");
}
}
输出结果:其中隐藏了个41“LANQIAO”
总结:主要考察多种复杂的情况,主要考虑全面性,文件太多使用IO流里的方法读取文件内容是个不错的选择