#include<bits/stdc++.h>//包含所有头文件
char str[10][10];//输入的字符串
int a[10];//标志数组
int cnt;//方案数
int n;//行
int k;//旗子数目
void dfs(int x,int y)
{
if(k==y)
{
cnt++;
return;
}
int i, j;
for(i=x;i<n;i++)//实现不同行
{
for(j=0;j<n;j++)
{
if(str[i][j]=='#'&&a[j]!=1){//a[j]!=1实现不同列
a[j]=1;
dfs(i+1,y+1);
a[j]=0;
}
}
}
}
int main()
{
while(scanf("%d%d",&n,&k)!=EOF)
{
if(n==-1&&k==-1)
{
return 0;
}
memset(a,0,sizeof(a));
int i;
for(i=0;i<n;i++)
{
scanf("%s",str[i]);
}
cnt=0;
dfs(0,0);//行数和棋子
printf("%d\n",cnt);
}
return 0;
}
注意:本题递归中的循环变量i和j要定义成局部变量。