#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int len,m,ans;
struct mp
{
char maps[10][10];
int line;//标记这是第几行
};
void dfs(mp tems,int n)
{
if(n==0){ans++;return;}//放下全部的棋子,方法加一
for(int i=tems.line+1;i<=len-n;i++){//从头到尾搜一次
for(int j=0;j<len;j++){
if(tems.maps[i][j]=='#'){
mp tems2;
tems2=tems;
tems2.line=i;
for(int k=i+1;k<len;k++)tems2.maps[k][j]='.';//21,22,23更新棋局
dfs(tems2,n-1);//放好一个棋子,处理下一个棋子
}//走出循环递归之后,tems又变为主函数传来的tems,棋局回到最开始的状态
}
}
}
int main()
{
while(1){
scanf("%d%d",&len,&m);
if(len==-1&&m==-1)break;
ans=0;
mp tem;
tem.line=-1;//一开始为-1+1行
for(int i=0;i<len;i++){
scanf("%s",tem.maps[i]);
}
dfs(tem,m);
printf("%d\n",ans);
}
return 0;
}
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int len,m,ans;
struct mp
{
char maps[10][10];
int line;//标记这是第几行
};
void dfs(mp tems,int n)
{
if(n==0){ans++;return;}//放下全部的棋子,方法加一
for(int i=tems.line+1;i<=len-n;i++){//从头到尾搜一次
for(int j=0;j<len;j++){
if(tems.maps[i][j]=='#'){
mp tems2;
tems2=tems;
tems2.line=i;
for(int k=i+1;k<len;k++)tems2.maps[k][j]='.';//21,22,23更新棋局
dfs(tems2,n-1);//放好一个棋子,处理下一个棋子
}//走出循环递归之后,tems又变为主函数传来的tems,棋局回到最开始的状态
}
}
}
int main()
{
while(1){
scanf("%d%d",&len,&m);
if(len==-1&&m==-1)break;
ans=0;
mp tem;
tem.line=-1;//一开始为-1+1行
for(int i=0;i<len;i++){
scanf("%s",tem.maps[i]);
}
dfs(tem,m);
printf("%d\n",ans);
}
return 0;
}