题解:在这里我是用每次处理按行来处理的,这样在以后的搜索当中只需样判断是否同列就可以了
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;i++)
int n,k;
char e[10][10];//存储棋盘
int v[10];//表示每一次的列是否有棋子
int sum=0;//用来计所有的情况
void dfs(int i,int step)
{
if(step==k)
{
sum++;
return ;
}
else if(i>n)
return ;
else{
rep(l,1,n)
{
if(e[i][l]=='#'&&!v[l])
{
v[l]=1;
dfs(i+1,step+1);
v[l]=0;
}
}
}
dfs(i+1,step);//这一步一定要有,否则会缺少情况的
return ;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
while(cin>>n>>k&&(n!=-1||k!=-1))
{
sum=0;
rep(i,1,n)
{
rep(j,1,n){
cin>>e[i][j];
}
}
dfs(1,0);//从第一列开始
cout<<sum<<endl;
}
return 0;
}