多少个X 蓝桥杯模拟
问题描述
给定一个字母矩阵。一个 X 图形由中心点和由中心点向四个45度斜线方向引出的直线段组成,四条
线段的长度相同,而且四条线段上的字母和中心点的字母相同。
一个 X图形可以使用三个整数 r, c, L 来描述,其中 r, c 表示中心点位于第 r 行第 c 列,正整数 L 表
示引出的直线段的长度。 对于 1 到 L 之间的每个整数 i,X图形满足:第 r-i 行第 c-i 列与第 r 行第 c 列相
同,第 r-i 行第 c+i 列与第 r 行第 c 列相同,第 r+i 行第 c-i 列与第 r 行第 c 列相同,第 r+i 行第 c+i 列与
第 r 行第 c 列相同。
例如,对于下面的字母矩阵中,所有的字母 L 组成一个 X图形,其中中间的 5 个 L 也组成一个 X图
形。所有字母 Q 组成了一个 X图形。
LAAALA
ALQLQA
AALQAA
ALQLQA
LAAALA
给定一个字母矩阵,请求其中有多少个 X图形。
输入格式
输入第一行包含两个整数 n, m,分别表示字母矩阵的行数和列数。
接下来 n 行,每行 m 个大写字母,为给定的矩阵。
输出格式
输出一行,包含一个整数,表示答案。
n,m = map(int,input().split())
map=[]
for i in range(n):
map.append(input())
cnt = 0
x = min(n,m)//2# 最长的长度最大为min(n,m)//2,因为X是对称的 不//2也行
for i in range(1,n-1):
for j in range(1,m-1):
for k in range(1,x+1):#判断45°方向上的字母是否相同
a,b,c,d= i-k,i+k,j-k,j+k
if a>=0 and b<n and c>=0 and d<m:
if map[i][j]==map[a][c]==map[a][d]==map[b][c]==map[b][d]:
cnt+=1
else:#不break也行
break
print(cnt)