这是简单的深搜题,但本人也是看了网上的提示才写出的。
注意棋子个数可能小于棋盘的数目,因此要对每个棋盘进行考虑。
对于在一列有了棋子,标记这一列,搜索时不在这列进行棋盘的寻找。要记得取消标记。
#include<stdio.h> #include<string.h> char s[9][9]; __int64 sum; int a,b,f[9]; void dfs(int q,int w) { int i,j,k; if(w==0) {sum++;return ;} for(i=q;i<=a;i++) { for(j=0;j<a;j++) { if(f[j]!=0) continue; if(s[i][j]=='#') { f[j]=1; dfs(i+1,w-1); f[j]=0; } } } } int main() { int i; while(scanf("%d %d",&a,&b)&&a!=-1&&b!=-1) { memset(f,0,sizeof(f)); sum=0; for(i=1;i<=a;i++) scanf("%s",s[i]); dfs(1,b); printf("%I64d\n",sum); } return 0; }