一道水题,需要注意的是,放置棋子时,可以跳过此行进入下一行。
以下是代码:
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
int n,k,ans=0;
char a[10][10];
int b[10]; //记录这一列是否有放置棋子
void dfs(int x,int step)
{
if(step==k) {ans++;return ;}
if(x>=n)return ;
for(int i=0;i<n;i++){
if(a[x][i]=='#' && !b[i]){
b[i]=1;
dfs(x+1,step+1); //选择在这一行放置
b[i]=0;
}
}
dfs(x+1,step); //选择跳过这一行
}
int main()
{
// freopen("in.txt","r",stdin);
while(1){
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
scanf("%d%d",&n,&k);
if(n==-1 && k==-1)break;
for(int i=0;i<n;i++)
scanf("%s",a[i]);
ans=0;
dfs(0,0);
printf("%d\n",ans);
}
return 0;
}