#include <iostream> using namespace std; int map[8][8]; int visited[8][8]; int N, K; int total; bool ok(int n, int j) { for(int i = 0; i < n; ++i) if(visited[i][j]) return false; return true; } //已遍历行数n, 已取可行行数cnt void dfs(int n, int cnt) { if(cnt == K) { total++; return; } if(n >= N) return; //取这一行中某一可行的列 for(int i = 0; i < N; ++i) if(!visited[n][i] && map[n][i] && ok(n, i)) { visited[n][i] = true; dfs(n+1, cnt+1); //此处取列后,列的统计数cnt加1 visited[n][i] = false; } //不取第n行的任意列 dfs(n+1, cnt); //此处没有取列,列的统计数cnt不变 } int main() { char ch; while(scanf("%d%d", &N, &K) && N != -1) { memset(visited, 0, sizeof(visited)); memset(map, 0, sizeof(map)); for(int i = 0; i < N; ++i) for(int j = 0; j < N; ++j) { cin >> ch; if(ch == '#') map[i][j] = 1; } total = 0; dfs(0, 0); printf("%d/n", total); } return 0; }