http://poj.org/problem?id=1321
#include<stdio.h>
#include<iostream>
#include<math.h>
#include<stdlib.h>
#include<ctype.h>
#include<algorithm>
#include<vector>
#include<string.h>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include <sstream>
#include <time.h>
#include <utility>
#include <malloc.h>
using namespace std;
int n, k, c;
char cc;
bool p[10][10];
bool visx[10];
bool visy[10];
void dfs(int pos,int a)
{
if (a == k)
{
c++;
return;
}
while (pos < n*n)
{
int x = pos / n;
int y = pos % n;
if (p[x][y] && !visx[x] && !visy[y])
{
visx[x] = visy[y] = true;
dfs(pos+1,a+1);
visx[x] = visy[y] = false;
}
pos++;
}
return;
}
int main()
{
while (scanf("%d%d",&n,&k)!=EOF)
{
c = 0;
if (n == -1 && k == -1)
return 0;
getchar();
memset(p,false,sizeof(p));
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cc = getchar();
if (cc == '#')
p[i][j] = true;
else
p[i][j] = false;
}
getchar();
}
memset(visx,false,sizeof(visx));
memset(visy, false, sizeof(visy));
dfs(0, 0);
printf("%d\n",c);
}
}