题目链接:点击打开链接
思路:按行枚举所有情况就可以了,代码有注解
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=9;
int col[maxn],tol,m,n,k;
char op[maxn][maxn];
void DFS(int cur)
{
if(m==k)
{
tol++;
return;
}
if(cur>=n)return;//已经过了最后一行
for(int i=0;i<n;i++)
{
if(op[cur][i]=='#'&&!col[i])
{
col[i]=1;
m++;
DFS(cur+1);
col[i]=0;
m--;
}
}
DFS(cur+1);//这一行不选,进入下一行
}
int main()
{
int i,j;
while(scanf("%d %d",&n,&k)&&!(n==-1&&k==-1))
{
memset(col,0,sizeof(col));//初始化标记列数组
for(i=0;i<n;i++)
scanf("%s",op[i]);
tol=0;
m=0;//已经放了几个棋子
DFS(0);
printf("%d\n",tol);
}
return 0;
}