CF919C

· · 题解

不要爆搜!!!

蒟蒻用搜索后觉得是常数问题,卡了半天常数才知道爆搜不可能过。

正解也非常简单,开两个二重循环,数每行每列连续的空格就可以了。

#include<bits/stdc++.h>
using namespace std;
int n,m,k,ans;
int a[2001][2001];
int main()
{
    char a1;
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=n;i++){
        a1=getchar();
        for(int j=1;j<=m;j++){
            a1=getchar();
            if(a1=='.')a[i][j]=1;
        }   
    } 
    for(int i=1;i<=n;i++){//数每一行连着的空格
        int l=0;
        for(int j=1;j<=m;j++){
            if(a[i][j]==1)l++;
            if(!a[i][j]||j==m){
                if(l>=k)ans+=l-k+1;
                l=0;    
            }
        }
    }
    for(int i=1;i<=m;i++){//数每一列连着的空格
        int l=0;
        for(int j=1;j<=n;j++){
            if(a[j][i]==1)l++;
            if(!a[j][i]||j==n){
                if(l>=k)ans+=l-k+1; 
                l=0;
            }
        }
    }
    if(k==1)ans/=2;//当k=1时,分别向下向右了两遍,需要除以二。
        printf("%d",ans);
    return 0;
}