题目链接
1.特判k=1的情况
2.不能直接暴力,如果k太大,会变成n^3,前缀搞一下。
#include<bits/stdc++.h>
using namespace std;
const int maxn=2005;
#define LL long long
const int inf=0x3f3f3f3f;
char mapp[maxn][maxn];
int r[maxn][maxn],c[maxn][maxn];
int main()
{
int n,m,k;
while(~scanf("%d%d%d",&n,&m,&k))
{
memset(mapp,0,sizeof(mapp));
memset(r,0,sizeof(r));
memset(c,0,sizeof(c));
int ans=0;
for(int i=1; i<=n; i++)
{
scanf("%s",mapp[i]+1);
for(int j=1;j<=strlen(mapp[i]+1);j++)
{
if(mapp[i][j]=='.')
{
ans++;
r[i][j]=r[i][j-1]+1;
c[i][j]=c[i-1][j]+1;
}
}
}
if(k==1)
{
printf("%d\n",ans);
continue;
}
ans=0;
for(int i=1; i<=n; i++)
{
for(int j=k; j<=m; j++)
{
if(r[i][j]-r[i][j-k]==k) ans++;
}
}
for(int i=k; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
if(c[i][j]-c[i-k][j]==k) ans++;
}
}
printf("%d\n",ans);
}
return 0;
}