给出一个棋盘,上面#位置标记可放,然后再给出一个数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; }