版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhuxiyulu/article/details/77980309
/*
dfs
*/
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int n,k;
char mp[10][10];
bool vis[10];//第i列是否放过棋子
int ans;
//row为行,cnt为已经放了多少个棋子
void dfs(int row,int cnt)
{
if(row>=n&&cnt!=k) return ;
if(k-cnt>n-row) return ;//剩余的行数不足以放完棋子
if(cnt==k)
{
ans++;
return ;
}
for(int i=0;i<n;i++)//枚举每一列
{
if(mp[row][i]=='#'&&vis[i]==0)
{
vis[i]=1;
dfs(row+1,cnt+1);//当前位置放一个棋子
vis[i]=0;//标记复位
}
}
dfs(row+1,cnt);//当前位置不放棋子
}
int main()
{
while(~scanf("%d%d",&n,&k))
{
if(n==-1&&k==-1) break;
for(int i=0;i<n;i++)
{
scanf("%s",mp[i]);
}
ans=0;
memset(vis,0,sizeof(vis));
dfs(0,0);
printf("%d\n",ans);
}
return 0;
}