学习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