思路:先判断行列够不够站k个人,然后分别遍历计算行和列,ansr、ansc记录位置的个数,判断和k相等就ansrr、anscc加一即为一种方法,然后ansr、ansc减一(避免多座少法),碰到障碍或换行、列就清零,最后输出ansrr+anscc
#include <iostream>
#include <stdlib.h>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
using namespace std;
int r,c,k,ansr=0,ansc=0,ansrr=0,anscc=0;
char map[105][105];
int main(){
cin>>r>>c>>k;
for(int i=1;i<=r;i++){
for(int j=1;j<=c;j++){
cin>>map[i][j];
}
}
if(k>r && k>c){
cout<<0<<endl;
return 0;
}
if(k<=r){
for(int i=1;i<=r;i++){
for(int j=1;j<=c;j++){
if(map[i][j]!='#'){
ansr++;
if(ansr==k) {
ansrr++;
ansr-=1;
}
}
else{
ansr=0;
}
}
ansr=0;
}
}
if(k<=c){
for(int i=1;i<=c;i++){
for(int j=1;j<=r;j++){
if(map[j][i]!='#'){
ansc++;
if(ansc==k) {
anscc++;
ansc-=1;
}
}
else{
ansc=0;
}
}
ansc=0;
}
}
cout<<ansrr+anscc<<endl;
return 0;
}