#include<bits/stdc++.h>
using namespace std;int main() {int r,c,k;cin>>r>>c>>k;char a[105][105];int ans=0;for(int i=0;i<r;i++){for(int j=0;j<c;j++){cin>>a[i][j];}}for(int i=0;i<r;i++){int cnt=0; // 用来记录连续空地的数量for(int j=0;j<c;j++){if(a[i][j]=='.'){cnt++; // 如果是空地,连续空地计数增加} else{if(cnt>=k) ans+=cnt-k+1;// 连续空地数大于等于 K 时,可以放置队员cnt=0; // 重置连续空地计数}}if(cnt>=k){ // 行末还有连续空地的情况,需要处理ans+=cnt-k+1;}}for(int j=0;j<c;j++){int cnt=0;for(int i=0;i<r;i++){if(a[i][j]=='.'){cnt++;} else{if(cnt>=k) ans+=cnt-k+1;cnt=0;}}if(cnt>=k) ans+=cnt-k+1;}if(k==1) ans/=2;// 如果 K == 1,则需要除以 2,因为每个空地计算了两次cout<<ans;}
水平扫描(按行)
- 对每一行进行扫描,累积每段连续的空地数量。
- 当遇到杂物(
#
)时,检查当前空地段的长度cnt
是否大于等于k
,如果满足条件,则可以放置队员,且可以从中选cnt - k + 1
个位置。 - 对每行扫描完后,检查该行末尾是否存在连续的空地段(例如
...
),并更新答案。
垂直扫描(按列):
- 对每一列进行类似的操作,累积连续空地并检查可行的站位方式。
注意:如果 k == 1
,则每个空地点都会被统计两次。因此,最终答案需要除以 2。