思路:类似于八皇后问题
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=15;
int n,k,ans;
char s[maxn][maxn];
int map[maxn][maxn];
int l[maxn];
void dfs(int h,int step)
{
if(step==k)//累加方案数
{
ans++;
return ;
}
if(h==n+1) return ;//越界
dfs(h+1,step);
for(int i=1;i<=n;i++)
{
if(!l[i]&&map[h][i])//因为按行放置,需检查列是否重复
{
map[h][i]=0;
l[i]=1;
dfs(h+1,step+1);//回溯
l[i]=0;
map[h][i]=1;
}
}
}
int main()
{
while(scanf("%d%d",&n,&k)!=EOF&&n!=-1&&k!=-1)
{
memset(map,0,sizeof(map));
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
cin>>s[i][j];
if(s[i][j]=='#')
{
map[i][j]=1;//处理数据
}
}
ans=0;
dfs(1,0);//放置第一行第0个
cout<<ans<<endl;
}
return 0;
}