题目链接:http://codeforces.com/problemset/problem/919/C
题意:给你m行n列的座位,其中" * "是有人坐," . "是没有人坐的坐的座位。有k个人想连续坐在一排或者一列,问你有多少种方法
题目思路:刚开始想的很复杂,如果一行人数多于k的话用人数num!/k!。后面发现只要人数超过了k每一次+1就好了,效果是一样的。还有就是列的计数,刚开始我想分开计数,就是先把行计算好了,再计算列,后面发现只需要每次统计s[i][j]是否为" . ",再开一个数组ss[maxn],就可以统计了。其中k=1时要特别统计,不然会重复。
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<string>
#include<iostream>
#include<map>
#include<vector>
#include<set>
#include<queue>
using namespace std;
const int maxn=1010*2;
const int INF=0x3f3f3f3f;
char s[maxn][maxn];
int ss[maxn];
int main()
{
int m,n,k;
cin>>m>>n>>k;
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
cin>>s[i][j];
}int c=0,ans=0;
memset(ss,0,sizeof(ss));
if(k==1)
{
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
if(s[i][j]=='.')
c++;
}
}
}
else{
for(int i=1;i<=m;i++)
{
ans=0;
for(int j=1;j<=n;j++)
{
if(s[i][j]=='.')
{
ans++;
ss[j]++;
}
else
{
ans=0;
ss[j]=0;
}
if(ans>=k)
c++;
if(ss[j]>=k)
c++;
}
}
}
cout<<c<<endl;
return 0;
}