codeforces 919C Seat Arrangements

题目链接: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;	
}

猜你喜欢

转载自blog.csdn.net/okimaru/article/details/81583650