题目描述
教室有n排座位,每排有m个座位,将教室表示为�∗�n∗m 的矩阵。字符'.'代表一个空座位,而'*'意味着座位被占用。你需要在同一行或同一列中找到k个连续的空席位,并为你和你的朋友安排这些座位。你的任务是找出安排座位的方式。如果学生所占据的地方不同,两种方式被认为是不同的。
输入格式
第一行n, m, k (1≤�,�,�≤2000)(1≤n,m,k≤2000)
接下来一个n*m的矩阵。
输出格式
一个整数 表示不同的方案数
Translated by Pine
题解
#include<bits/stdc++.h>
using namespace std;
char s[2005][2005];
int n,m,k,cnt,ans;//ans记录答案,cnt记录每次.的数量
int main(){
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>s[i][j];
for(int i=1;i<=n;i++){//按行判断
cnt=0;
for(int j=1;j<=m;j++){
if(s[i][j]=='.') cnt++;
else cnt=0;
if(cnt>=k)
ans++;//满足则答案加一
}
}
for(int j=1;j<=m;j++){//按列判断
cnt =0;
for(int i=1;i<=n;i++){
if(s[i][j]=='.') cnt++;
else cnt=0;
if(cnt>=k)
ans++;
}
}
if(k==1)//1比较特别,行列会算两次,所以要除二
cout<<ans/2<<endl;
else cout<<ans<<endl;
return 0;
}