1 //纯dfs() 2 3 #include <iostream> 4 #include <algorithm> 5 #include <string> 6 #include <cstdio> 7 #include <cstring> 8 9 using namespace std; 10 const int maxn = 10; 11 char g[maxn][maxn]; 12 bool vis[maxn]; //列标记 13 int n, k; 14 int ans; 15 16 void dfs(int nowx,int num){ 17 if (num == k){ 18 ans++; 19 return; 20 } 21 22 if (nowx >= n) //越界 23 return; 24 25 for (int i = 0; i < n; i++){ 26 if (g[nowx][i] == ‘#‘ && !vis[i]){ 27 vis[i] = 1; 28 dfs(nowx + 1, num + 1); 29 vis[i] = 0; 30 } 31 } 32 dfs(nowx + 1, num); 33 return; 34 } 35 36 int main(){ 37 while (~scanf("%d %d", &n, &k)){ 38 if (n == -1 && k == -1) 39 break; 40 ans = 0; 41 memset(vis, 0, sizeof(vis)); 42 for (int i = 0; i < n; i++){ 43 scanf("%s", &g[i]); 44 } 45 dfs(0, 0); 46 printf("%d\n", ans); 47 } 48 //system("pause"); 49 return 0; 50 }