给出一个棋盘,上面#位置标记可放,然后再给出一个数k,表示要放k个棋子,要求没有两个在同一行和同一列上,输出所有情况个数
dfs问题,dfs(d,k),表示在第d行上放第k个棋子
#include<stdio.h>
#include<string.h>
char ch[10][10];
int f[10],cnt,n;
int DFS(int r,int k)
{
int j;
if(k==0)
{
cnt++;
return cnt;
}
if(r>=n) return cnt;
for(j=0;j<n;j++)
{
if(!f[j]&&ch[r][j]=='#')
{
f[j]=1;
DFS(r+1,k-1);//进入下一行搜索下一个棋子的位置
f[j]=0;
}
}
DFS(r+1,k);
}
int main()
{
int k,i,j;
while(scanf("%d%d",&n,&k)&&(n!=-1))
{
for(i=0;i<n;i++)
{
getchar();
for(j=0;j<n;j++)
{
scanf("%c",&ch[i][j]);
}
}
memset(f,0,sizeof(f));
cnt=0;
printf("%d\n",DFS(0,k));
}
return 0;
}

浙公网安备 33010602011771号