思路:本题的难点在k<n的情况,所以我们可以另dfs中的两个参数分别代表起始行和待放棋子个数(待放棋子只能放在起始行后面的行),然后用一个c[8]来表示每一列放旗子的情况来判断列不重复
#include<stdio.h> #include<algorithm> #include<string.h> using namespace std; int a[10][10],c[8],n,k,ans; void dfs(int x,int num) { int j,tx,nu; for(j=0;j<n;j++) { if(a[x][j]==1&&c[j]==0) { if(num==1) ans++; else { c[j]=1; tx=x+1; for(;tx<n-num+2;tx++) dfs(tx,num-1); c[j]=0; } } } } int main() { int i,j; char s; while(scanf("%d%d",&n,&k)!=EOF) { if(n==-1||k==-1)break; ans=0; for(i=0;i<n;i++){ for(j=0;j<n;j++){ scanf(" %c",&s); if(s=='#') a[i][j]=1; else a[i][j]=0; } } memset(c,0,sizeof(c)); for(i=0;i<=n-k;i++) { dfs(i,k); } printf("%d\n",ans); } return 0; }