主要采用的是暴力枚举的方法,要注意两个点
第一,不要忽略k=1的情况
第二,不要忽略要求是一个接着一个组成一个长度为k的队伍
主要采用的方法是针对每一个空格的位置,对其向右和向下进行搜索
代码如下所示
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main(){
int r,c,k;
cin>>r>>c>>k;
int a[r][c];
memset(a,0,sizeof(a));
char x;
for(int i=0;i<r;i++){
for(int j=0;j<c;j++){
cin>>x;
if(x=='.') a[i][j]=1;
if(x=='#') a[i][j]=0;
}
}
int ans=0;
for(int i=0;i<r;i++){
for(int j=0;j<c;j++){
if(a[i][j]==1){
//首先对于k==1的情况单独列举
if(k==1){
ans++;
continue;
}
//向右进行搜索
if(a[i][j+1]==1){
int flag=1;
for(int x=j+1;x<c&&flag<k;x++){
if(a[i][x]==0) break;
flag++;
}
if(flag>=k)
ans++;
}
if(a[i+1][j]==1){
int flag=1;
for(int y=i+1;y<r&&flag<k;y++){
if(a[y][j]==0) break;
flag++;
}
if(flag>=k)
ans++;
}
}
}
}
cout<<ans<<endl;
return 0;
}