用递归 dfs 回溯即可
#include<iostream>
using namespace std;
#define N 10
char mat[N][N];
int vis[N],c;
void dfs(int n,int k,int row)
{
if(k==0)
{
c++;
return ;
}
if(row>n-1)
return;
for(int j=0;j<n;j++)
{
if(mat[row][j]=='#')
{
bool flag=true;
for(int i=0;i<row;i++)
{
if(vis[i]==j)
{
flag=false;
break;
}
}
if(flag)
{
vis[row]=j;
dfs(n,k-1,row+1);
}
}
}
dfs(n,k,row+1);
}
//void dfs(int row,int n,int cur,int k)
//{
// if(cur==k)
// {
// c++;
// return;
// }
// else
// {
// for(int i=row;i<n;i++)
// for(int j=0;j<n;j++)
// {
// if(mat[i][j]=='#'&&vis[j]==0)
// {
// vis[j]=1;
// dfs(row+1,n,cur+1,k);
// vis[j]=0;
// }
// }
// }
//}
int main()
{
int n,k;
while(cin>>n>>k)
{
if(n==-1&&k==-1)
break;
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
cin>>mat[i][j];
}
vis[i]=0;
}
c=0;
dfs(n,k,0);
//dfs(0,n,0,k);
cout<<c<<endl;
}
return 0;
}