n,m=map(int,input().split())
board=[input().strip() for _ in range(n)]
count=0
points=[]
point_set=set(points)

for i in range(n):
    for j in range(m):
        if board[i][j]=="X":
            points.append((i,j))

point_set=set(points)

for i in range(len(points)):
    x1,y1=points[i]
    for j in range(i+1,len(points)):
      x2,y2=points[j]
      dx=x2-x1
      dy=y2-y1
//顺时针
      x3,y3=x1+dy,y1-dx
      x4,y4=x2+dy,y2-dx

      if (x3,y3) in point_set and (x4,y4) in point_set:
        count=count+1
//逆时针
      x3,y3=x1-dy,y1+dx
      x4,y4=x2-dy,y2+dx

      if (x3,y3) in point_set and (x4,y4) in point_set:
        count=count+1
print(count // 4)

  1. 向量的基本概念 在平面几何中,两点 (x1, y1) 和 (x2, y2) 之间的向量可以表示为 (dx, dy),其中: dx = x2 - x1(x 方向的变化量) dy = y2 - y1(y 方向的变化量) 这个向量表示从点 (x1, y1) 到点 (x2, y2) 的位移。
  2. 向量旋转的数学原理 若有一个向量 (dx, dy),将其顺时针旋转 90 度后得到的新向量为 (dy, -dx);逆时针旋转 90 度得到的新向量为 (-dy, dx)。 验证旋转后的垂直性: 原向量 (dx, dy) 与旋转后的向量 (dy, -dx) 的点积为:dxdy + dy(-dx) = 0 点积为 0 说明两向量垂直,因此旋转后的向量与原向量垂直
  3. 正方形的几何特性 如果 (x1, y1) 和 (x2, y2) 是正方形的一条对角线,那么另外两个顶点 (x3, y3) 和 (x4, y4) 必然满足: (x3, y3) 和 (x4, y4) 是 (x1, y1) 和 (x2, y2) 关于中心点的对称点 对角线向量 (dx, dy) 旋转 90 度后,可以得到从对角线端点到另外两个顶点的向量