思路:仿照玉蟾宫,处理出 h
数组和 l
数组,然后对于每个非障碍格统计其作为右下角出现的次数。
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1005;
char a[maxn][maxn];
int n,m;
int h[maxn][maxn],l[maxn][maxn];
inline char getc(){
char c=getchar();
while(c!='.'&&c!='*')c=getchar();
return c;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
a[i][j]=getc();
}
}
/*for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<a[i][j];
}
cout<<"\n";
}*/
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]=='*'){
h[i][j]=0;
}else{
h[i][j]=h[i-1][j]+1;
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]=='.'){
l[i][j]=(a[i][j-1]=='.'?l[i][j-1]:j);
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]=='.'){
if(a[i-1][j]=='.'){
l[i][j]=max(l[i][j],l[i-1][j]);
}
}
}
}
int ans=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]=='.'){
ans+=(j-l[i][j]+1)*h[i][j];
}
}
}
cout<<ans;
return 0;
}