测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A38891. 全相等三角形给定一个字母矩阵,定义一个LQ三角形为某行中连续的几个字母、某列中连续的几个字母和一条45度的斜线中连续的几个字母组成的等腰直角三角形的边缘部分,其中每条边上的字母数量相等且至少为2。例如,对于下面的字母矩阵中,所有的字母L组成一个LQ三角形,所有字母Q组成了一个LQ三角形,所有字母C也组成了一个LQ三角形。如果一个LQ三角形边上的所有字母相等,则称为一个全相等三角形。以三个例子都是…

填空题 困难

题目描述

全相等三角形

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

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

如果一个LQ三角形边上的所有字母相等,则称为一个全相等三角形。以三个例子都是全相等三角形。

给定一个字母矩阵,请求其中有多少个全相等三角形。

输入格式

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

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

输出格式

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

样例输入1

3 4

AAAA

ALAQ

ALQQ

样例输出1

4

样例输入2

6 7

AAAAAAA

ALLLLLA

ALQQLAA

ALQLAAC

ALLAACC

ALAACCC

样例输出2

23

评测用例规模与约定

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

参考答案

#初始化矩阵 n,m=map(int,input().split()) mp = [] for _ in range(n): mp.append(list(input())) 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 mp[i][j]!=mp[x][y]: return False y+=1 x, y = i, j for k in range(l):#向下直线 if mp[i][j] != mp[x][y]: return False x+=1 x, y = i, j+l-1 for k in range(l) :#右->左下 斜线 if mp[i][j] != mp[x][y]: return False x+=1 y-=1 return True def lf_down(i,j,l): #左下是否构成全相等三角形 if j-l+1<0 or i+l-1>=n:#越界 return False x, y = i, j for k in range(l) :#向左直线 if mp[i][j]!=mp[x][y]: return False y-=1 x, y = i, j for k in range(l):#向下直线 if mp[i][j] != mp[x][y]: return False x+=1 x, y = i, j-l+1 for k in range(l):#左->右下 斜线 if mp[i][j] != mp[x][y]: return False x+=1 y+=1 return True def lf_up(i,j,l):#左上是否构成全相等三角形 if j-l+1<0 or i-l+1<0 :#越界 return False x, y = i, j for k in range(l) :#向左直线 if mp[i][j]!=mp[x][y]: return False y-=1 x, y = i, j for k in range(l) :#向上直线 if mp[i][j] != mp[x][y]: return False x-=1 x, y = i-l+1, j for k in range(l):#上->左下 斜线 if mp[i][j] != mp[x][y]: return False x+=1 y-=1 return True def rt_up(i,j,l):#右上是否构成全相等三角形 if j+l-1>=m or i-l+1<0 :#越界 return False x, y = i, j for k in range(l) :#向右直线 if mp[i][j]!=mp[x][y]: return False y+=1 x, y = i, j for k in range(l) :#向上直线 if mp[i][j] != mp[x][y]: return False x-=1 x, y = i-l+1, j for k in range(l):#上->左下 斜线 if mp[i][j] != mp[x][y]: return False x+=1 y+=1 return True l=min(n,m) ans=0 for k in range(2,l+1): for i in range(n): for j in range(m): #向四个方向查看边长为k的全相等三角形 if rt_down(i,j,k): ans+=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)
上一题 下一题