写个深搜就行了。注意棋子是放在‘ # ’而不是' . '位置。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n,k,cnt,m[10][10],v[10];
void Backtrack(int dep,int num)
{
int i;
if (num == k)
{
cnt++;
return ;
}
if (dep == n)
{
return ;
}
for (i=0; i<n; i++)
{
if (v[i] == 1 || m[dep][i] == 0)
continue;
v[i]=1;
Backtrack(dep+1,num+1);
v[i]=0;
}
Backtrack(dep+1,num);
}
int main()
{
int i,j;
char tc;
while (1)
{
scanf("%d%d",&n,&k);
if (n == -1 && k == -1)
break;
getchar();
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
{
scanf("%c",&tc);
if (tc == '#')
m[i][j]=8;
else
m[i][j]=0;
}
getchar();
}
cnt=0;
memset(v,0,sizeof(v));
Backtrack(0,0);
printf("%d\n",cnt);
}
}