//pku1321 棋盘问题 #include <cstdio> #include <cstring> #define MAX_N 8 typedef unsigned char BYTE; BYTE place[MAX_N][MAX_N]; BYTE nPlace[MAX_N]; long N, K; unsigned long gTotal; BYTE gMark = 0; void dfs(long level=0, long k=0) { long i, j; for (i=level; i<=(N-K+k); i++) { for (j=0; j<nPlace[i]; j++) { if (! (gMark & place[i][j])) { if (k+1 == K) gTotal++; else { gMark |= place[i][j]; dfs(i+1, k+1); gMark &= (~place[i][j]); } } } } } int main() { while (2 == scanf("%ld%ld", &N, &K)) { if (-1==N || -1==K) break; memset(nPlace, 0, N*sizeof(nPlace[0])); gTotal = 0; gMark = 0; long i, j; char buffer[MAX_N+1]; for (i=0; i<N; i++) { scanf("%s", buffer); BYTE val = 1; for (j=0; j<N; j++) { if ('#' == buffer[j]) place[i][ nPlace[i]++ ] = val; val = val << 1; } } if (K <= N) dfs(); printf("%ld/n", gTotal); } return 0; }