题目解析: 类似于八皇后问题,逐行进行搜索,然后要判断不能在同一列中,由于k<n,所以在原先八皇后问题的基础之上也即for循环之后再加一个dfs().
代码如下:
#include<cstdio>
#include<cstring>
char chess[10][10];
int flag[10][10];
int ans;
int n,k;
bool judge(int r,int c)
{
for(int i=r-1;i>=0;i--)
if(flag[i][c]) return false;
for(int j=r+1;j<=n-1;j++)
if(flag[j][c]) return false;
return true;
}
void dfs(int row,int num)
{
if(num==k)
{
ans++;
return;
}
if(row==n)
return;
for(int i=0;i<n;i++) //对每一列进行搜索
{
if(chess[row][i]=='#'&&!flag[row][i]&&judge(row,i)) //说明当前位置可以放棋子
{
flag[row][i]=1;
dfs(row+1,num+1);
flag[row][i]=0;
}
}
dfs(row+1,num);
}
int main()
{
while(scanf("%d%d",&n,&k)!=EOF)
{
if(n==-1&&k==-1)
break;
for(int i=0;i<n;i++)
scanf("%s",chess[i]);
memset(flag,0,sizeof(flag));
ans=0;
dfs(0,0);
printf("%d\n",ans);
}
return 0;
}