此题借鉴他人思路:
原版链接:https://blog.csdn.net/kindlucy/article/details/5835003
源码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int k,n,sum;
char a[10][10];
int b[105];
void dfs(int r,int k)
{
if(k==0) //棋子填完了
{
sum++;
return;
}
for(int i=r;i<n;i++)
for(int j=0;j<n;j++)
{
if(a[i][j]=='.'||b[j]==1) //此处不能放棋子或此列用过了
continue;
b[j]=1;
dfs(i+1,k-1);
b[j]=0;
}
}
int main()
{
while(scanf("%d %d",&n,&k)!=EOF)
{
sum=0;
if(n==-1&&k==-1)
break;
memset(a,'\0',sizeof(a));
memset(b,0,sizeof(b));
getchar();
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
a[i][j]=getchar();
getchar();
}
dfs(0,k);
printf("%d\n",sum);
}
return 0;
}