这是个简单搜索问题,直接深搜dfs;
#include <iostream>
#include <cstring>
using namespace std;
int n,m;
char G[10][10];
int M[10][10];
int Flag[10];
int ans;
void dfs(int d,int k) //当前搜d行,已经放好了k颗棋
{
if(k==m){ans++;return ;}
if(d>n-1) return;
for(int i=d+1;i<n;++i)
for(int j=0;j<n;++j)
{
if(M[i][j]&&!Flag[j])
{
Flag[j]=1;
dfs(i,k+1);
Flag[j]=0;
}
}
}
int main()
{
while(cin>>n>>m)
{
if(n==-1&&m==-1) return 0;
else{
memset(M,0,sizeof(M));
memset(Flag,0,sizeof(Flag));
ans=0;
for(int i=0;i<n;++i)
for(int j=0;j<n;++j)
cin>>G[i][j];
for(int i=0;i<n;++i)
for(int j=0;j<n;++j)
if(G[i][j]=='#') M[i][j]=1;
dfs(-1,0);
cout<<ans<<endl;
}
}
return 0;
}