http://bailian.openjudge.cn/practice/1321/
注意:因为k<=n,所以分两种:这一行选或不选
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n,k,res,vis[10];//标记列号
char a[10][20];
void dfs(int r,int step)
{
if(step==k)
{
res++;
return;
}
if(r==n)
return;
for(int i=0;i<n;i++)
{
if(vis[i]==0&&a[r][i]=='#')
{
vis[i]=1;
dfs(r+1,step+1);//选
vis[i]=0;
}
}
dfs(r+1,step);//不选
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
while(cin >> n >> k,n!=-1&&k!=-1)
{
res=0;
for(int i=0;i<n;i++)
cin >> a[i];
dfs(0,0);//第0行第一个棋子
cout << res << endl;
}
return 0;
}