http://poj.org/problem?id=1321
#include<stdio.h>
#include<string.h>
#define N 100
char str[N][N];
int n,ans,k,r[N],c[N],l;
struct node
{
int x;
int y;
}p[N];
void dfs(int num,int sum)
{
if(num<=l&&sum==0)
{
ans++;
return ;
}
if(num>=l)
{
return ;
}
int x=p[num].x;
int y=p[num].y;
if(r[x]==0&&c[y]==0)
{
r[x]=1;
c[y]=1;
dfs(num+1,sum-1);
r[x]=0;
c[y]=0;
dfs(num+1,sum);
}
else
{
dfs(num+1,sum);
}
}
int main()
{
int i,j;
while(scanf("%d%d",&n,&k)!=EOF)
{
if(n==-1&&k==-1)break ;
ans=0;
memset(r,0,sizeof(r));
memset(c,0,sizeof(c));
getchar();
for( i=0;i<n;i++)
scanf("%s",str[i]);
l=0;
for(i=0;i<n;i++)
{
int len=strlen(str[i]);
for(j=0;j<len;j++)
{
if(str[i][j]=='#')
{
p[l].x=i;
p[l].y=j;
l++;
}
}
}
//printf("%d\n",l);
dfs(0,k);
printf("%d\n",ans);
}
}