O(n3) 模拟遍历+前缀和优化
#include <bits/stdc++.h>
using namespace std;
const int N=550;
char mp[N][N];
int pre[N][N];
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
//mp[i][j]='.';
cin>>mp[i][j];
if(mp[i][j]=='*')pre[i][j]=pre[i][j-1]+1;
else pre[i][j]=pre[i][j-1];
}
int ans=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
if(mp[i][j]=='*'){
int x=i+1,y=j-1,x1=i+1,y1=j+1;
while(mp[x][y]=='*'&&mp[x1][y1]=='*'){
if(x>i&&pre[x1][y1]-pre[x][y-1]==y1-y+1){
ans++;
//cout<<i<<" "<<j<<endl;
}
x++,x1++;
y--,y1++;
}
}
}
cout<<ans;
return 0;
}