/*
题意:中文题,忽略
题解:DFS;因为k<=n,因此和普通的棋盘问题又有点不同,就是在搜索时要
注意某些行可能会没有点。
*/
#include <iostream>
#include <cstring>
using namespace std;
int n,k,ans;
int vis_cl[10];//记录列是否已存在点
char m[10][10];
void dfs(int r, int sum)//DFS,r为当前行,sum为当前搜索到的点的个数
{
if (sum == k)//满足k个,结束搜索
{
ans++;
return;
}
if (r >= n)//越界结束
return ;
for(int j=0; j<n; j++)
{
if ('#'==m[r][j] && !vis_cl[j])//有点就先搜索,后复原
{
vis_cl[j] = 1;
dfs(r+1,sum+1);
vis_cl[j] = 0;
}
}
dfs(r+1,sum);//并不是所有行都有点,因此为了让DFS不在搜索完所有
//解之前退出,这句的意思是当前行不加点,但是要继
//续搜索下一行
}
int main(void)
{
while (cin>>n>>k && n!=-1 && k!=-1)
{
for(int i=0; i<n; i++)
cin>>m[i];
ans = 0;
memset(vis_cl,0,sizeof(vis_cl));
dfs(0,0);
cout<<ans<<endl;
}
return 0;
}