历年蓝桥杯Python青少组中/高级选拔赛(STEMA)真题解析 | 2022年11月模拟赛编程题(9)

学习Python从娃娃抓起!记录下蓝桥杯备考学习过程中的题目,记录每一个瞬间。
附上汇总贴:历年蓝桥杯Python青少组中/高级选拔赛(STEMA)真题解析 | 汇总


【题目描述】
给定一个字母矩阵,定义一个LQ三角形为某行中连续的几个字母、某列中连续的几个字母和一条45度的斜线中连续的几个字母组成的等腰直角三角形的边缘部分,其中每条边上的字母数量相等且至少为2。
例如,对于下面的字母矩阵中,所有的字母L组成一个LQ三角形,所有字母Q组成了一个LQ三角形,所有字母C也组成了一个LQ三角形。
[图片]
如果一个LQ三角形边上的所有字母相等,则称为一个全相等三角形。以三个例子都是全相等三角形。
给定一个字母矩阵,请求其中有多少个全相等三角形。
【输入】
输入第一行包含两个整数n,m,分别表示字母矩阵的行数和列数。
接下来n行,每行m个大写字母,为给定的矩阵。
【输出】
输出一行,包含一个整数,表示答案。
【输入样例】

3 4
AAAA
ALAQ
ALQQ

【输出样例】

4

【代码详解】
[图片]

n, m = [int(i) for i in input().split()]
a = [[0 for i in range(105)] for i in range(105)]
for i in range(1, n+1):  # 输入矩阵
    tmp = input()
    for j in range(1, m+1):
        a[i][j] = tmp[j-1]
# print(a)
l = min(n, m)
ans = 0

def rt_down(i, j, l):
    if j+l-1>m or i+l-1>n:
        return False
    x, y = i, j
    for k in range(l):  # 向右直线
        if a[i][j]!=a[x][y]:
            return False
        y+=1
    x, y = i, j
    for k in range(l):  # 向下直线
        if a[i][j]!=a[x][y]:
            return False
        x+=1
    x, y = i, j+l-1
    for k in range(l):  # 右上->左下斜线
        if a[i][j]!=a[x][y]:
            return False
        x+=1
        y-=1
    return True

def lf_down(i, j, l):
    if j-l+1<1 or i+l-1>n:
        return False
    x, y = i, j
    for k in range(l):  # 向左直线
        if a[i][j]!=a[x][y]:
            return False
        y-=1
    x, y = i, j
    for k in range(l):  # 向下直线
        if a[i][j]!=a[x][y]:
            return False
        x+=1
    x, y = i, j-l+1
    for k in range(l):  # 左上->右下斜线
        if a[i][j]!=a[x][y]:
            return False
        x+=1
        y+=1
    return True

def lf_up(i, j, l):
    if j-l+1<1 or i-l+1<1:
        return False
    x, y = i, j
    for k in range(l):  # 向左直线
        if a[i][j]!=a[x][y]:
            return False
        y-=1
    x, y = i, j
    for k in range(l):  # 向上直线
        if a[i][j]!=a[x][y]:
            return False
        x-=1
    x, y = i-l+1, j
    for k in range(l):  # 右上至左下斜线
        if a[i][j]!=a[x][y]:
            return False
        x+=1
        y-=1
    return True

def rt_up(i, j, l):
    if i-l+1<1 or j+l-1>m:
        return False
    x, y = i, j
    for k in range(l):  # 向右直线
        if a[i][j]!=a[x][y]:
            return False
        y+=1
    x, y = i, j
    for k in range(l):  # 向上直线
        if a[i][j]!=a[x][y]:
            return False
        x-=1
    x, y = i-l+1, j
    for k in range(l):
        if a[i][j]!=a[x][y]:
            return False
        x+=1
        y+=1
    return True

for k in range(2, l+1):  # 从当前点,遍历左上、左下、右上、右下方向是否构成LQ三角形
    for i in range(1, n+1):
        for j in range(1, m+1):
            if rt_down(i,j,k):
                ans +=1  # 可以构成LQ三角形的,数量加1
            if lf_down(i,j,k):
                ans +=1
            if lf_up(i,j,k):
                ans +=1
            if rt_up(i,j,k):
                ans +=1
print(ans)

【运行结果】

3 4
AAAA
ALAQ
ALQQ
4
  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值