中文题。
#include<iostream>
#include<cmath>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
using namespace std;
char pic[10][10];
bool jud[10][10]; //1代表棋盘
bool l[10]; //当前列是否已有棋子
int n, k, ans;
void dfs(int cur, int num){ //cur为当前行,num为已放棋子数目
if(num == k){
ans++;
return;
}
if(cur == n) return;
dfs(cur+1, num);
for(int i = 0; i < n; i++){
if(jud[cur][i] && !l[i]){
l[i] = 1;
dfs(cur+1, num+1);
l[i] = 0;
}
}
}
int main(){
//freopen("a.txt", "r", stdin);
while(scanf("%d %d", &n, &k) != EOF){
if(n == -1 && k == -1) break;
memset(jud, 0, sizeof(jud));
memset(l, 0, sizeof(l));
for(int i = 0; i < n; i++)
scanf("%s", pic[i]);
ans = 0;
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
if(pic[i][j] == '#')
jud[i][j] = 1;
}
}
dfs(0, 0);
cout << ans << endl;
}
return 0;
}