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

HINT

 

 如所示样例,用w表示wjh,用l表示另一人,四种坐法如下:

 

wl##

*###

####

####

 

 

lw##

*###

####

####

 

 

w*##

l###

####

####

 

 

l*##

w###

####

####

题解

很简单暴力纵向横向都搜索一下就是了,注意当k为0(即只有wjh一个人的时候)答案要除以2

#include<bits/stdc++.h>
using namespace std;
char s[108][108];
int main(){
    freopen("data10.in","r",stdin);
    freopen("data10.out","w",stdout);
    int n,k;
    scanf("%d%d",&n,&k);
    k++;
    for(int i=0;i<n;i++){
        scanf("%s",s[i]);
    }
    int ans=0;
    for(int i=0;i<n;i++){
        int sum=0;
        for(int j=0;j<n;j++){
            if(s[i][j]=='#'){
                if(sum>=k){
                    ans+=sum-k+1;
                }
                sum=0;
            }
            else{
                sum++;
            }
        }
        if(sum>=k){
            ans+=sum-k+1;
        }
    }
    for(int i=0;i<n;i++){
        int sum=0;
        for(int j=0;j<n;j++){
            if(s[j][i]=='#'){
                if(sum>=k){
                    ans+=sum-k+1;
                }
                sum=0;
            }
            else{
                sum++;
            }
        }
        if(sum>=k){
            ans+=sum-k+1;
        }
    }
    if(k==1) ans/=2;
    int c=1;
    for(int i=1;i<=k;i++){
        c*=i;
    }
    ans*=c;
    printf("%d\n",ans);
}