第九届蓝桥杯C组java_字母阵列

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

	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值