蓝桥杯 LQ三角形 模拟

给定一个字母矩阵,任务是找出所有全相等的LQ三角形的数量。输入包含矩阵的行数和列数,以及矩阵的具体内容。程序通过深度优先搜索策略遍历每个可能的三角形并计数。样例输入和输出展示了如何计算符合条件的三角形个数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

  给定一个字母矩阵,定义一个LQ三角形为某行中连续的几个字母、某列中连续的几个字母和一条45度的斜线中连续的几个字母组成的等腰直角三角形的边缘部分,其中每条边上的字母数量相等且至少为2 。   

        例如,对于下面的字母矩阵中,所有的字母 L 组成一个LQ三角形,所有字母 Q 组成了一个 LQ 三角形,所有字母 C 也组成了一个 LQ 三角形。   AAAAAAA   ALLLLLA   ALQQLAA   ALQLAAC   ALLAACC   ALAACCC   

        如果一个 LQ 三角形边上的所有字母相等,则称为一个全相等三角形。以三个例子都是全相等三角形。   给定一个字母矩阵,请求其中有多少个全相等三角形。

输入格式

   输入第一行包含两个整数 n, m,分别表示字母矩阵的行数和列数。   

        接下来 n 行,每行 m 个大写字母,为给定的矩阵。

输出格式

  输出一行,包含一个整数,表示答案。

样例输入

3 4 AAAA ALAQ ALQQ

样例输出

4

样例输入

6 7 AAAAAAA ALLLLLA ALQQLAA ALQLAAC ALLAACC ALAACCC

样例输出

23

评测用例规模与约定

  对于 50% 的评测用例,1 <= n, m <= 10。   对于所有评测用例,1 <= n, m <= 100。

=========================================================================

 

import java.util.Scanner;

public class Main1 {
    private static int n, m;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        m = sc.nextInt();
        char[][] cs = new char[n][m];
        for (int i = 0; i < n; i++) {
            cs[i] = sc.next().toCharArray();
        }
        int cnt = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                cnt += dfs(cs, i, j);
            }
        }
        System.out.println(cnt);
    }

    private static int dfs(char[][] cs, int x, int y) {
        char cur = cs[x][y];
        int ans = 0;
        // 右下角
        int len = 2;
        while (true) {
            boolean is = true;
            int X = x + len - 1, Y = y + len - 1;
            // 求两个横向的 如果不满足不需要继续循环
            if (X >= n || Y >= m || cs[X][y] != cur || cs[x][Y] != cur) break;
            // 看当前三角形是否符合
            for (int i = 1; i < len - 1; i++) {
                if (cs[x + i][Y - i] != cur) {
                    is = false;
                    break;
                }
            }
            len++;
            if (is) ans++;
        }
        // 右上角
        len = 2;
        while (true) {
            boolean is = true;
            int X = x - len + 1, Y = y + len - 1;
            if (X < 0 || Y >= m || cs[X][y] != cur || cs[x][Y] != cur) break;
            for (int i = 1; i < len - 1; i++) {
                if (cs[x - i][Y - i] != cur) {
                    is = false;
                    break;
                }
            }
            len++;
            if (is) ans++;
        }
        // 左上角
        len = 2;
        while (true) {
            boolean is = true;
            int X = x - len + 1, Y = y - len + 1;
            if (X < 0 || Y < 0 || cs[X][y] != cur || cs[x][Y] != cur) break;
            for (int i = 1; i < len - 1; i++) {
                if (cs[x - i][Y + i] != cur) {
                    is = false;
                    break;
                }
            }
            len++;
            if (is) ans++;
        }
        // 左下角
        len = 2;
        while (true) {
            boolean is = true;
            int X = x + len - 1, Y = y - len + 1;
            if (X >= n || Y < 0 || cs[X][y] != cur || cs[x][Y] != cur) break;
            for (int i = 1; i < len - 1; i++) {
                if (cs[x + i][Y + i] != cur) {
                    is = false;
                    break;
                }
            }
            len++;
            if (is) ans++;
        }
        return ans;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值