Problem:看电影
Description:
wjh要去看电影,邀请了lmb,xxb,cly,yzj,ckx等人,最后有k个人同意一起去。要去的电影院的位置是矩阵型的,其中’#’表示已经被人预定了,’*’表示空位,他们打算挑同一行或者同一列连续的座位坐在一起,现在给出k和位置的预定请况,试问有几种坐位置的方法。
Input:
第一行输入两个数n和k,n表示电影院的位置是n*n的。(0<n<=10,0<=k<10)
接下在n行,每行n个字符,表示位置的预订情况。
Output:
一行输出有几种坐法。
Sample Input:
4 1
**##
*###
Sample Output:
4
Note:
如所示样例,用w表示wjh,用l表示另一人,四种坐法如下:
wl##
*###
####
####
lw##
*###
####
####
w*##
l###
####
####
l*##
w###
####
####
Language:C++
#include <iostream>
using namespace std;
int n,k;
char s[11][11];
int ans;
void dfs(int condition)
{
for(int i=0;i<n;i++)
{
int sum=0;
for(int j=0;j<n;j++)
{
if((condition==0 ? s[i][j]:s[j][i])=='#')
{
if(sum>=k+1) ans+=sum-k;
sum=0;
}
else sum++;
}
if(sum>=k+1) ans+=sum-k;
}
}
int factorial(int n)
{
int f=1;
for(int i=1;i<=n;i++)
f*=i;
return f;
}
int main()
{
while(cin>>n>>k)
{
for(int i=0;i<n;i++) cin>>s[i];
dfs(0);
dfs(1);
cout<<(k==0 ? ans/2*factorial(k+1):ans*factorial(k+1))<<endl;
}
return 0;
}